From 9f9bbd8429af29554c44918d3cbe9688a251d48e Mon Sep 17 00:00:00 2001 From: j Date: Wed, 25 Nov 2015 11:12:48 +0000 Subject: [PATCH] update i686 --- .../python3.4/site-packages/OpenSSL/SSL.py | 1423 ------- .../site-packages/OpenSSL/__init__.py | 12 - .../python3.4/site-packages/OpenSSL/_util.py | 53 - .../python3.4/site-packages/OpenSSL/crypto.py | 2314 ------------ .../python3.4/site-packages/OpenSSL/rand.py | 180 - .../site-packages/OpenSSL/test/__init__.py | 6 - .../site-packages/OpenSSL/test/test_crypto.py | 3037 --------------- .../site-packages/OpenSSL/test/test_rand.py | 203 - .../site-packages/OpenSSL/test/test_ssl.py | 2736 -------------- .../site-packages/OpenSSL/test/util.py | 302 -- .../python3.4/site-packages/OpenSSL/tsafe.py | 28 - .../site-packages/OpenSSL/version.py | 9 - .../installed-files.txt | 682 ++-- .../_cffi_backend.cpython-34m.so | Bin 217248 -> 0 bytes .../cffi-0.8.6.egg-info/PKG-INFO | 28 - .../cffi-0.8.6.egg-info/SOURCES.txt | 104 - .../cffi-0.8.6.egg-info/installed-files.txt | 32 - .../cffi-0.8.6.egg-info/requires.txt | 1 - .../cffi-0.8.6.egg-info/top_level.txt | 2 - .../python3.4/site-packages/cffi/__init__.py | 8 - .../lib/python3.4/site-packages/cffi/api.py | 497 --- .../site-packages/cffi/backend_ctypes.py | 1049 ------ .../site-packages/cffi/commontypes.py | 248 -- .../python3.4/site-packages/cffi/cparser.py | 584 --- .../site-packages/cffi/ffiplatform.py | 112 - .../site-packages/cffi/gc_weakref.py | 19 - .../lib/python3.4/site-packages/cffi/lock.py | 30 - .../lib/python3.4/site-packages/cffi/model.py | 499 --- .../site-packages/cffi/vengine_cpy.py | 951 ----- .../site-packages/cffi/vengine_gen.py | 580 --- .../python3.4/site-packages/cffi/verifier.py | 243 -- .../cryptography-0.6.egg-info/PKG-INFO | 84 - .../cryptography-0.6.egg-info/SOURCES.txt | 217 -- .../dependency_links.txt | 1 - .../entry_points.txt | 3 - .../installed-files.txt | 202 - .../cryptography-0.6.egg-info/not-zip-safe | 1 - .../cryptography-0.6.egg-info/requires.txt | 3 - .../cryptography-0.6.egg-info/top_level.txt | 4 - ...aphy_cffi_3e31f141x4000d087.cpython-34m.so | Bin 1670660 -> 0 bytes ...aphy_cffi_7ab3712bx4f158fee.cpython-34m.so | Bin 25900 -> 0 bytes ...aphy_cffi_dd416c1exc1767c5a.cpython-34m.so | Bin 25980 -> 0 bytes .../site-packages/cryptography/__about__.py | 31 - .../site-packages/cryptography/__init__.py | 25 - .../site-packages/cryptography/exceptions.py | 63 - .../site-packages/cryptography/fernet.py | 129 - .../cryptography/hazmat/__init__.py | 14 - .../cryptography/hazmat/backends/__init__.py | 46 - .../hazmat/backends/commoncrypto/__init__.py | 19 - .../hazmat/backends/commoncrypto/backend.py | 253 -- .../hazmat/backends/commoncrypto/ciphers.py | 203 - .../hazmat/backends/commoncrypto/hashes.py | 62 - .../hazmat/backends/commoncrypto/hmac.py | 58 - .../hazmat/backends/interfaces.py | 308 -- .../hazmat/backends/multibackend.py | 397 -- .../hazmat/backends/openssl/__init__.py | 19 - .../hazmat/backends/openssl/backend.py | 1162 ------ .../hazmat/backends/openssl/ciphers.py | 227 -- .../hazmat/backends/openssl/cmac.py | 80 - .../hazmat/backends/openssl/dsa.py | 190 - .../hazmat/backends/openssl/ec.py | 254 -- .../hazmat/backends/openssl/hashes.py | 69 - .../hazmat/backends/openssl/hmac.py | 80 - .../hazmat/backends/openssl/rsa.py | 603 --- .../cryptography/hazmat/bindings/__init__.py | 14 - .../hazmat/bindings/commoncrypto/__init__.py | 14 - .../hazmat/bindings/commoncrypto/binding.py | 54 - .../hazmat/bindings/commoncrypto/cf.py | 114 - .../bindings/commoncrypto/common_cryptor.py | 110 - .../bindings/commoncrypto/common_digest.py | 69 - .../bindings/commoncrypto/common_hmac.py | 48 - .../commoncrypto/common_key_derivation.py | 50 - .../hazmat/bindings/commoncrypto/secimport.py | 95 - .../hazmat/bindings/commoncrypto/secitem.py | 38 - .../hazmat/bindings/commoncrypto/seckey.py | 35 - .../bindings/commoncrypto/seckeychain.py | 36 - .../bindings/commoncrypto/sectransform.py | 79 - .../hazmat/bindings/openssl/__init__.py | 14 - .../hazmat/bindings/openssl/aes.py | 70 - .../hazmat/bindings/openssl/asn1.py | 152 - .../hazmat/bindings/openssl/bignum.py | 114 - .../hazmat/bindings/openssl/binding.py | 168 - .../hazmat/bindings/openssl/bio.py | 181 - .../hazmat/bindings/openssl/cmac.py | 65 - .../hazmat/bindings/openssl/cms.py | 100 - .../hazmat/bindings/openssl/conf.py | 35 - .../hazmat/bindings/openssl/crypto.py | 67 - .../hazmat/bindings/openssl/dh.py | 57 - .../hazmat/bindings/openssl/dsa.py | 65 - .../hazmat/bindings/openssl/ec.py | 490 --- .../hazmat/bindings/openssl/ecdh.py | 68 - .../hazmat/bindings/openssl/ecdsa.py | 130 - .../hazmat/bindings/openssl/engine.py | 165 - .../hazmat/bindings/openssl/err.py | 347 -- .../hazmat/bindings/openssl/evp.py | 261 -- .../hazmat/bindings/openssl/hmac.py | 94 - .../hazmat/bindings/openssl/nid.py | 216 -- .../hazmat/bindings/openssl/objects.py | 45 - .../hazmat/bindings/openssl/opensslv.py | 36 - .../bindings/openssl/osrandom_engine.py | 218 -- .../hazmat/bindings/openssl/pem.py | 89 - .../hazmat/bindings/openssl/pkcs12.py | 41 - .../hazmat/bindings/openssl/pkcs7.py | 41 - .../hazmat/bindings/openssl/rand.py | 45 - .../hazmat/bindings/openssl/rsa.py | 108 - .../hazmat/bindings/openssl/ssl.py | 620 ---- .../hazmat/bindings/openssl/x509.py | 271 -- .../hazmat/bindings/openssl/x509_vfy.py | 336 -- .../hazmat/bindings/openssl/x509name.py | 61 - .../hazmat/bindings/openssl/x509v3.py | 103 - .../cryptography/hazmat/bindings/utils.py | 108 - .../hazmat/primitives/__init__.py | 14 - .../hazmat/primitives/asymmetric/__init__.py | 14 - .../hazmat/primitives/asymmetric/dsa.py | 337 -- .../hazmat/primitives/asymmetric/ec.py | 285 -- .../hazmat/primitives/asymmetric/padding.py | 65 - .../hazmat/primitives/asymmetric/rsa.py | 407 -- .../hazmat/primitives/ciphers/__init__.py | 21 - .../hazmat/primitives/ciphers/algorithms.py | 147 - .../hazmat/primitives/ciphers/base.py | 132 - .../hazmat/primitives/ciphers/modes.py | 116 - .../cryptography/hazmat/primitives/cmac.py | 73 - .../hazmat/primitives/constant_time.py | 54 - .../cryptography/hazmat/primitives/hashes.py | 119 - .../cryptography/hazmat/primitives/hmac.py | 73 - .../hazmat/primitives/interfaces.py | 476 --- .../hazmat/primitives/kdf/__init__.py | 14 - .../hazmat/primitives/kdf/hkdf.py | 124 - .../hazmat/primitives/kdf/pbkdf2.py | 66 - .../cryptography/hazmat/primitives/padding.py | 172 - .../hazmat/primitives/serialization.py | 50 - .../hazmat/primitives/src/constant_time.c | 31 - .../hazmat/primitives/src/constant_time.h | 16 - .../hazmat/primitives/twofactor/__init__.py | 14 - .../hazmat/primitives/twofactor/hotp.py | 69 - .../hazmat/primitives/twofactor/totp.py | 41 - .../site-packages/cryptography/utils.py | 34 - .../ed25519-1.3.egg-info/dependency_links.txt | 1 - .../PKG-INFO | 2 +- .../SOURCES.txt | 1 + .../dependency_links.txt | 0 .../installed-files.txt | 10 +- .../top_level.txt | 0 .../site-packages/ed25519/__init__.py | 2 +- .../ed25519/_ed25519.cpython-34m.so | Bin 267992 -> 261609 bytes .../site-packages/ed25519/_version.py | 20 +- .../python3.4/site-packages/ed25519/keys.py | 10 +- .../site-packages/ed25519/test_ed25519.py | 56 +- .../__init__.py} | 711 ++-- .../_vendor/__init__.py | 0 .../_vendor/packaging/__about__.py | 2 +- .../_vendor/packaging/__init__.py | 0 .../_vendor/packaging/_compat.py | 13 + .../_vendor/packaging/_structures.py | 0 .../_vendor/packaging/specifiers.py | 784 ++++ .../_vendor/packaging/version.py | 403 ++ .../pyOpenSSL-0.14.egg-info/PKG-INFO | 30 - .../pyOpenSSL-0.14.egg-info/SOURCES.txt | 58 - .../dependency_links.txt | 1 - .../installed-files.txt | 30 - .../pyOpenSSL-0.14.egg-info/requires.txt | 2 - .../pyOpenSSL-0.14.egg-info/top_level.txt | 1 - .../pycparser-2.10-py3.4.egg-info/PKG-INFO | 17 - .../pycparser-2.10-py3.4.egg-info/SOURCES.txt | 22 - .../dependency_links.txt | 1 - .../installed-files.txt | 38 - .../top_level.txt | 1 - .../site-packages/pycparser/__init__.py | 94 - .../site-packages/pycparser/_ast_gen.py | 273 -- .../site-packages/pycparser/_build_tables.py | 34 - .../site-packages/pycparser/_c_ast.cfg | 188 - .../site-packages/pycparser/ast_transforms.py | 105 - .../site-packages/pycparser/c_ast.py | 748 ---- .../site-packages/pycparser/c_generator.py | 405 -- .../site-packages/pycparser/c_lexer.py | 477 --- .../site-packages/pycparser/c_parser.py | 1634 -------- .../site-packages/pycparser/lextab.py | 9 - .../site-packages/pycparser/ply/__init__.py | 4 - .../site-packages/pycparser/ply/cpp.py | 898 ----- .../site-packages/pycparser/ply/ctokens.py | 133 - .../site-packages/pycparser/ply/lex.py | 1058 ------ .../site-packages/pycparser/ply/yacc.py | 3276 ----------------- .../site-packages/pycparser/plyparser.py | 55 - .../site-packages/pycparser/yacctab.py | 286 -- .../DESCRIPTION.rst | 238 ++ .../setuptools-18.6.1.dist-info/METADATA | 268 ++ .../setuptools-18.6.1.dist-info/RECORD | 124 + .../WHEEL | 2 +- .../dependency_links.txt | 2 +- .../entry_points.txt | 5 +- .../setuptools-18.6.1.dist-info/metadata.json | 1 + .../top_level.txt | 0 .../zip-safe} | 0 .../DESCRIPTION.rst | 2111 ----------- .../setuptools-6.0.2.dist-info/METADATA | 2142 ----------- .../setuptools-6.0.2.dist-info/RECORD | 166 - .../setuptools-6.0.2.dist-info/metadata.json | 1 - .../setuptools-6.0.2.dist-info/zip-safe | 1 - .../site-packages/setuptools/__init__.py | 70 +- .../setuptools/_vendor/packaging/version.py | 786 ---- .../site-packages/setuptools/archive_util.py | 40 +- .../site-packages/setuptools/cli-32.exe | Bin .../site-packages/setuptools/cli-64.exe | Bin .../site-packages/setuptools/cli-arm-32.exe | Bin .../site-packages/setuptools/cli.exe | Bin .../setuptools/command/bdist_egg.py | 13 +- .../setuptools/command/build_ext.py | 73 +- .../setuptools/command/build_py.py | 17 +- .../setuptools/command/develop.py | 27 + .../setuptools/command/easy_install.py | 704 ++-- .../setuptools/command/egg_info.py | 53 +- .../setuptools/command/install_scripts.py | 19 +- .../site-packages/setuptools/command/sdist.py | 63 +- .../site-packages/setuptools/command/test.py | 48 +- .../setuptools/command/upload_docs.py | 3 +- .../site-packages/setuptools/dist.py | 65 +- .../site-packages/setuptools/extension.py | 28 +- .../site-packages/setuptools/gui-32.exe | Bin .../site-packages/setuptools/gui-64.exe | Bin .../site-packages/setuptools/gui-arm-32.exe | Bin .../site-packages/setuptools/gui.exe | Bin .../site-packages/setuptools/msvc9_support.py | 11 +- .../site-packages/setuptools/package_index.py | 22 +- .../site-packages/setuptools/sandbox.py | 219 +- .../site-packages/setuptools/svn_utils.py | 585 --- .../setuptools/tests/__init__.py | 351 -- .../setuptools/tests/environment.py | 165 - .../setuptools/tests/py26compat.py | 14 - .../setuptools/tests/script-with-bom.py | 3 - .../site-packages/setuptools/tests/server.py | 82 - .../setuptools/tests/test_bdist_egg.py | 72 - .../setuptools/tests/test_build_ext.py | 19 - .../setuptools/tests/test_develop.py | 122 - .../setuptools/tests/test_dist_info.py | 83 - .../setuptools/tests/test_easy_install.py | 462 --- .../setuptools/tests/test_egg_info.py | 210 -- .../setuptools/tests/test_find_packages.py | 170 - .../setuptools/tests/test_integration.py | 83 - .../setuptools/tests/test_markerlib.py | 68 - .../setuptools/tests/test_msvc9compiler.py | 157 - .../setuptools/tests/test_packageindex.py | 203 - .../setuptools/tests/test_resources.py | 612 --- .../setuptools/tests/test_sandbox.py | 83 - .../setuptools/tests/test_sdist.py | 552 --- .../setuptools/tests/test_svn.py | 245 -- .../setuptools/tests/test_test.py | 126 - .../setuptools/tests/test_upload_docs.py | 72 - .../site-packages/setuptools/version.py | 2 +- .../setuptools/windows_support.py | 29 + .../DESCRIPTION.rst | 10 +- .../METADATA | 12 +- .../site-packages/six-1.10.0.dist-info/RECORD | 8 + .../WHEEL | 12 +- .../six-1.10.0.dist-info/metadata.json | 1 + .../top_level.txt | 0 .../site-packages/six-1.8.0.dist-info/RECORD | 8 - .../six-1.8.0.dist-info/metadata.json | 1 - Linux_i686/lib/python3.4/site-packages/six.py | 158 +- .../sqlalchemy/cprocessors.cpython-34m.so | Bin 34544 -> 35281 bytes .../sqlalchemy/cresultproxy.cpython-34m.so | Bin 39156 -> 39633 bytes .../sqlalchemy/cutils.cpython-34m.so | Bin 20472 -> 18343 bytes 261 files changed, 3813 insertions(+), 49662 deletions(-) delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/SSL.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/_util.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/crypto.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/rand.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/test/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_crypto.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_rand.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_ssl.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/test/util.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/tsafe.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/OpenSSL/version.py delete mode 100755 Linux_i686/lib/python3.4/site-packages/_cffi_backend.cpython-34m.so delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/PKG-INFO delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/SOURCES.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/installed-files.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/requires.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/top_level.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/api.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/backend_ctypes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/commontypes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/cparser.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/ffiplatform.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/gc_weakref.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/lock.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/model.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/vengine_cpy.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/vengine_gen.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cffi/verifier.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/PKG-INFO delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/SOURCES.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/dependency_links.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/entry_points.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/installed-files.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/not-zip-safe delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/requires.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/top_level.txt delete mode 100755 Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_3e31f141x4000d087.cpython-34m.so delete mode 100755 Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_7ab3712bx4f158fee.cpython-34m.so delete mode 100755 Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_dd416c1exc1767c5a.cpython-34m.so delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/__about__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/exceptions.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/fernet.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/backend.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/ciphers.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hashes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/interfaces.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/multibackend.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/backend.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ciphers.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/cmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/dsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ec.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hashes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/rsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/binding.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/cf.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_cryptor.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_digest.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_hmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secimport.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secitem.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckey.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckeychain.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/sectransform.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/aes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/asn1.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bignum.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/binding.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bio.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cms.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/conf.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/crypto.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dh.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ec.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdh.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/engine.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/err.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/evp.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/hmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/nid.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/objects.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/opensslv.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/osrandom_engine.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pem.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs12.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs7.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rand.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ssl.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509_vfy.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509name.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509v3.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/utils.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/padding.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/base.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/modes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/cmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/constant_time.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hashes.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hmac.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/interfaces.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/padding.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/serialization.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.c delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.h delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/totp.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/cryptography/utils.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/dependency_links.txt rename Linux_i686/lib/python3.4/site-packages/{ed25519-1.3.egg-info => ed25519-1.4.egg-info}/PKG-INFO (98%) rename Linux_i686/lib/python3.4/site-packages/{ed25519-1.3.egg-info => ed25519-1.4.egg-info}/SOURCES.txt (95%) rename Linux_i686/lib/python3.4/site-packages/{cffi-0.8.6.egg-info => ed25519-1.4.egg-info}/dependency_links.txt (100%) rename Linux_i686/lib/python3.4/site-packages/{ed25519-1.3.egg-info => ed25519-1.4.egg-info}/installed-files.txt (100%) rename Linux_i686/lib/python3.4/site-packages/{ed25519-1.3.egg-info => ed25519-1.4.egg-info}/top_level.txt (100%) rename Linux_i686/lib/python3.4/site-packages/{pkg_resources.py => pkg_resources/__init__.py} (85%) rename Linux_i686/lib/python3.4/site-packages/{setuptools => pkg_resources}/_vendor/__init__.py (100%) rename Linux_i686/lib/python3.4/site-packages/{setuptools => pkg_resources}/_vendor/packaging/__about__.py (98%) rename Linux_i686/lib/python3.4/site-packages/{setuptools => pkg_resources}/_vendor/packaging/__init__.py (100%) rename Linux_i686/lib/python3.4/site-packages/{setuptools => pkg_resources}/_vendor/packaging/_compat.py (63%) rename Linux_i686/lib/python3.4/site-packages/{setuptools => pkg_resources}/_vendor/packaging/_structures.py (100%) create mode 100644 Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/PKG-INFO delete mode 100644 Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/SOURCES.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/dependency_links.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/installed-files.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/requires.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/top_level.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/PKG-INFO delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/SOURCES.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/dependency_links.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/installed-files.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/top_level.txt delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/_ast_gen.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/_build_tables.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/_c_ast.cfg delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/ast_transforms.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/c_ast.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/c_generator.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/c_lexer.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/c_parser.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/lextab.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/ply/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/ply/cpp.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/ply/ctokens.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/ply/lex.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/ply/yacc.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/plyparser.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/pycparser/yacctab.py create mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/DESCRIPTION.rst create mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/METADATA create mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/RECORD rename Linux_i686/lib/python3.4/site-packages/{six-1.8.0.dist-info => setuptools-18.6.1.dist-info}/WHEEL (70%) rename Linux_i686/lib/python3.4/site-packages/{setuptools-6.0.2.dist-info => setuptools-18.6.1.dist-info}/dependency_links.txt (50%) rename Linux_i686/lib/python3.4/site-packages/{setuptools-6.0.2.dist-info => setuptools-18.6.1.dist-info}/entry_points.txt (95%) create mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/metadata.json rename Linux_i686/lib/python3.4/site-packages/{setuptools-6.0.2.dist-info => setuptools-18.6.1.dist-info}/top_level.txt (100%) rename Linux_i686/lib/python3.4/site-packages/{cffi-0.8.6.egg-info/not-zip-safe => setuptools-18.6.1.dist-info/zip-safe} (100%) delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/DESCRIPTION.rst delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/METADATA delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/RECORD delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/metadata.json delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/zip-safe delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/version.py mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/cli-32.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/cli-64.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/cli-arm-32.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/cli.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/gui-32.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/gui-64.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/gui-arm-32.exe mode change 100755 => 100644 Linux_i686/lib/python3.4/site-packages/setuptools/gui.exe delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/svn_utils.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/__init__.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/environment.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/py26compat.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/script-with-bom.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/server.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_bdist_egg.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_build_ext.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_develop.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_dist_info.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_easy_install.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_egg_info.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_find_packages.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_integration.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_markerlib.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_msvc9compiler.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_packageindex.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_resources.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_sandbox.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_sdist.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_svn.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_test.py delete mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_upload_docs.py create mode 100644 Linux_i686/lib/python3.4/site-packages/setuptools/windows_support.py rename Linux_i686/lib/python3.4/site-packages/{six-1.8.0.dist-info => six-1.10.0.dist-info}/DESCRIPTION.rst (63%) rename Linux_i686/lib/python3.4/site-packages/{six-1.8.0.dist-info => six-1.10.0.dist-info}/METADATA (77%) create mode 100644 Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD rename Linux_i686/lib/python3.4/site-packages/{setuptools-6.0.2.dist-info => six-1.10.0.dist-info}/WHEEL (67%) create mode 100644 Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json rename Linux_i686/lib/python3.4/site-packages/{six-1.8.0.dist-info => six-1.10.0.dist-info}/top_level.txt (100%) delete mode 100644 Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/RECORD delete mode 100644 Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/metadata.json diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/SSL.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/SSL.py deleted file mode 100644 index a257f16..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/SSL.py +++ /dev/null @@ -1,1423 +0,0 @@ -from sys import platform -from functools import wraps, partial -from itertools import count -from weakref import WeakValueDictionary -from errno import errorcode - -from six import text_type as _text_type -from six import integer_types as integer_types - -from OpenSSL._util import ( - ffi as _ffi, - lib as _lib, - exception_from_error_queue as _exception_from_error_queue, - native as _native) - -from OpenSSL.crypto import ( - FILETYPE_PEM, _PassphraseHelper, PKey, X509Name, X509, X509Store) - -_unspecified = object() - -try: - _memoryview = memoryview -except NameError: - class _memoryview(object): - pass - -OPENSSL_VERSION_NUMBER = _lib.OPENSSL_VERSION_NUMBER -SSLEAY_VERSION = _lib.SSLEAY_VERSION -SSLEAY_CFLAGS = _lib.SSLEAY_CFLAGS -SSLEAY_PLATFORM = _lib.SSLEAY_PLATFORM -SSLEAY_DIR = _lib.SSLEAY_DIR -SSLEAY_BUILT_ON = _lib.SSLEAY_BUILT_ON - -SENT_SHUTDOWN = _lib.SSL_SENT_SHUTDOWN -RECEIVED_SHUTDOWN = _lib.SSL_RECEIVED_SHUTDOWN - -SSLv2_METHOD = 1 -SSLv3_METHOD = 2 -SSLv23_METHOD = 3 -TLSv1_METHOD = 4 -TLSv1_1_METHOD = 5 -TLSv1_2_METHOD = 6 - -OP_NO_SSLv2 = _lib.SSL_OP_NO_SSLv2 -OP_NO_SSLv3 = _lib.SSL_OP_NO_SSLv3 -OP_NO_TLSv1 = _lib.SSL_OP_NO_TLSv1 - -OP_NO_TLSv1_1 = getattr(_lib, "SSL_OP_NO_TLSv1_1", 0) -OP_NO_TLSv1_2 = getattr(_lib, "SSL_OP_NO_TLSv1_2", 0) - -try: - MODE_RELEASE_BUFFERS = _lib.SSL_MODE_RELEASE_BUFFERS -except AttributeError: - pass - -OP_SINGLE_DH_USE = _lib.SSL_OP_SINGLE_DH_USE -OP_EPHEMERAL_RSA = _lib.SSL_OP_EPHEMERAL_RSA -OP_MICROSOFT_SESS_ID_BUG = _lib.SSL_OP_MICROSOFT_SESS_ID_BUG -OP_NETSCAPE_CHALLENGE_BUG = _lib.SSL_OP_NETSCAPE_CHALLENGE_BUG -OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG = _lib.SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG -OP_SSLREF2_REUSE_CERT_TYPE_BUG = _lib.SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG -OP_MICROSOFT_BIG_SSLV3_BUFFER = _lib.SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER -try: - OP_MSIE_SSLV2_RSA_PADDING = _lib.SSL_OP_MSIE_SSLV2_RSA_PADDING -except AttributeError: - pass -OP_SSLEAY_080_CLIENT_DH_BUG = _lib.SSL_OP_SSLEAY_080_CLIENT_DH_BUG -OP_TLS_D5_BUG = _lib.SSL_OP_TLS_D5_BUG -OP_TLS_BLOCK_PADDING_BUG = _lib.SSL_OP_TLS_BLOCK_PADDING_BUG -OP_DONT_INSERT_EMPTY_FRAGMENTS = _lib.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS -OP_CIPHER_SERVER_PREFERENCE = _lib.SSL_OP_CIPHER_SERVER_PREFERENCE -OP_TLS_ROLLBACK_BUG = _lib.SSL_OP_TLS_ROLLBACK_BUG -OP_PKCS1_CHECK_1 = _lib.SSL_OP_PKCS1_CHECK_1 -OP_PKCS1_CHECK_2 = _lib.SSL_OP_PKCS1_CHECK_2 -OP_NETSCAPE_CA_DN_BUG = _lib.SSL_OP_NETSCAPE_CA_DN_BUG -OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG= _lib.SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG -try: - OP_NO_COMPRESSION = _lib.SSL_OP_NO_COMPRESSION -except AttributeError: - pass - -OP_NO_QUERY_MTU = _lib.SSL_OP_NO_QUERY_MTU -OP_COOKIE_EXCHANGE = _lib.SSL_OP_COOKIE_EXCHANGE -OP_NO_TICKET = _lib.SSL_OP_NO_TICKET - -OP_ALL = _lib.SSL_OP_ALL - -VERIFY_PEER = _lib.SSL_VERIFY_PEER -VERIFY_FAIL_IF_NO_PEER_CERT = _lib.SSL_VERIFY_FAIL_IF_NO_PEER_CERT -VERIFY_CLIENT_ONCE = _lib.SSL_VERIFY_CLIENT_ONCE -VERIFY_NONE = _lib.SSL_VERIFY_NONE - -SESS_CACHE_OFF = _lib.SSL_SESS_CACHE_OFF -SESS_CACHE_CLIENT = _lib.SSL_SESS_CACHE_CLIENT -SESS_CACHE_SERVER = _lib.SSL_SESS_CACHE_SERVER -SESS_CACHE_BOTH = _lib.SSL_SESS_CACHE_BOTH -SESS_CACHE_NO_AUTO_CLEAR = _lib.SSL_SESS_CACHE_NO_AUTO_CLEAR -SESS_CACHE_NO_INTERNAL_LOOKUP = _lib.SSL_SESS_CACHE_NO_INTERNAL_LOOKUP -SESS_CACHE_NO_INTERNAL_STORE = _lib.SSL_SESS_CACHE_NO_INTERNAL_STORE -SESS_CACHE_NO_INTERNAL = _lib.SSL_SESS_CACHE_NO_INTERNAL - -SSL_ST_CONNECT = _lib.SSL_ST_CONNECT -SSL_ST_ACCEPT = _lib.SSL_ST_ACCEPT -SSL_ST_MASK = _lib.SSL_ST_MASK -SSL_ST_INIT = _lib.SSL_ST_INIT -SSL_ST_BEFORE = _lib.SSL_ST_BEFORE -SSL_ST_OK = _lib.SSL_ST_OK -SSL_ST_RENEGOTIATE = _lib.SSL_ST_RENEGOTIATE - -SSL_CB_LOOP = _lib.SSL_CB_LOOP -SSL_CB_EXIT = _lib.SSL_CB_EXIT -SSL_CB_READ = _lib.SSL_CB_READ -SSL_CB_WRITE = _lib.SSL_CB_WRITE -SSL_CB_ALERT = _lib.SSL_CB_ALERT -SSL_CB_READ_ALERT = _lib.SSL_CB_READ_ALERT -SSL_CB_WRITE_ALERT = _lib.SSL_CB_WRITE_ALERT -SSL_CB_ACCEPT_LOOP = _lib.SSL_CB_ACCEPT_LOOP -SSL_CB_ACCEPT_EXIT = _lib.SSL_CB_ACCEPT_EXIT -SSL_CB_CONNECT_LOOP = _lib.SSL_CB_CONNECT_LOOP -SSL_CB_CONNECT_EXIT = _lib.SSL_CB_CONNECT_EXIT -SSL_CB_HANDSHAKE_START = _lib.SSL_CB_HANDSHAKE_START -SSL_CB_HANDSHAKE_DONE = _lib.SSL_CB_HANDSHAKE_DONE - - -class Error(Exception): - """ - An error occurred in an `OpenSSL.SSL` API. - """ - - - -_raise_current_error = partial(_exception_from_error_queue, Error) - - -class WantReadError(Error): - pass - - - -class WantWriteError(Error): - pass - - - -class WantX509LookupError(Error): - pass - - - -class ZeroReturnError(Error): - pass - - - -class SysCallError(Error): - pass - - - -class _VerifyHelper(object): - def __init__(self, connection, callback): - self._problems = [] - - @wraps(callback) - def wrapper(ok, store_ctx): - cert = X509.__new__(X509) - cert._x509 = _lib.X509_STORE_CTX_get_current_cert(store_ctx) - error_number = _lib.X509_STORE_CTX_get_error(store_ctx) - error_depth = _lib.X509_STORE_CTX_get_error_depth(store_ctx) - - try: - result = callback(connection, cert, error_number, error_depth, ok) - except Exception as e: - self._problems.append(e) - return 0 - else: - if result: - _lib.X509_STORE_CTX_set_error(store_ctx, _lib.X509_V_OK) - return 1 - else: - return 0 - - self.callback = _ffi.callback( - "int (*)(int, X509_STORE_CTX *)", wrapper) - - - def raise_if_problem(self): - if self._problems: - try: - _raise_current_error() - except Error: - pass - raise self._problems.pop(0) - - - -def _asFileDescriptor(obj): - fd = None - if not isinstance(obj, integer_types): - meth = getattr(obj, "fileno", None) - if meth is not None: - obj = meth() - - if isinstance(obj, integer_types): - fd = obj - - if not isinstance(fd, integer_types): - raise TypeError("argument must be an int, or have a fileno() method.") - elif fd < 0: - raise ValueError( - "file descriptor cannot be a negative integer (%i)" % (fd,)) - - return fd - - - -def SSLeay_version(type): - """ - Return a string describing the version of OpenSSL in use. - - :param type: One of the SSLEAY_ constants defined in this module. - """ - return _ffi.string(_lib.SSLeay_version(type)) - - - -class Session(object): - pass - - - -class Context(object): - """ - :py:obj:`OpenSSL.SSL.Context` instances define the parameters for setting up - new SSL connections. - """ - _methods = { - SSLv3_METHOD: "SSLv3_method", - SSLv23_METHOD: "SSLv23_method", - TLSv1_METHOD: "TLSv1_method", - TLSv1_1_METHOD: "TLSv1_1_method", - TLSv1_2_METHOD: "TLSv1_2_method", - } - _methods = dict( - (identifier, getattr(_lib, name)) - for (identifier, name) in _methods.items() - if getattr(_lib, name, None) is not None) - - - def __init__(self, method): - """ - :param method: One of SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, or - TLSv1_METHOD. - """ - if not isinstance(method, integer_types): - raise TypeError("method must be an integer") - - try: - method_func = self._methods[method] - except KeyError: - raise ValueError("No such protocol") - - method_obj = method_func() - if method_obj == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - context = _lib.SSL_CTX_new(method_obj) - if context == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - context = _ffi.gc(context, _lib.SSL_CTX_free) - - self._context = context - self._passphrase_helper = None - self._passphrase_callback = None - self._passphrase_userdata = None - self._verify_helper = None - self._verify_callback = None - self._info_callback = None - self._tlsext_servername_callback = None - self._app_data = None - - # SSL_CTX_set_app_data(self->ctx, self); - # SSL_CTX_set_mode(self->ctx, SSL_MODE_ENABLE_PARTIAL_WRITE | - # SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | - # SSL_MODE_AUTO_RETRY); - self.set_mode(_lib.SSL_MODE_ENABLE_PARTIAL_WRITE) - - - def load_verify_locations(self, cafile, capath=None): - """ - Let SSL know where we can find trusted certificates for the certificate - chain - - :param cafile: In which file we can find the certificates - :param capath: In which directory we can find the certificates - :return: None - """ - if cafile is None: - cafile = _ffi.NULL - elif not isinstance(cafile, bytes): - raise TypeError("cafile must be None or a byte string") - - if capath is None: - capath = _ffi.NULL - elif not isinstance(capath, bytes): - raise TypeError("capath must be None or a byte string") - - load_result = _lib.SSL_CTX_load_verify_locations(self._context, cafile, capath) - if not load_result: - _raise_current_error() - - - def _wrap_callback(self, callback): - @wraps(callback) - def wrapper(size, verify, userdata): - return callback(size, verify, self._passphrase_userdata) - return _PassphraseHelper( - FILETYPE_PEM, wrapper, more_args=True, truncate=True) - - - def set_passwd_cb(self, callback, userdata=None): - """ - Set the passphrase callback - - :param callback: The Python callback to use - :param userdata: (optional) A Python object which will be given as - argument to the callback - :return: None - """ - if not callable(callback): - raise TypeError("callback must be callable") - - self._passphrase_helper = self._wrap_callback(callback) - self._passphrase_callback = self._passphrase_helper.callback - _lib.SSL_CTX_set_default_passwd_cb( - self._context, self._passphrase_callback) - self._passphrase_userdata = userdata - - - def set_default_verify_paths(self): - """ - Use the platform-specific CA certificate locations - - :return: None - """ - set_result = _lib.SSL_CTX_set_default_verify_paths(self._context) - if not set_result: - # TODO: This is untested. - _raise_current_error() - - - def use_certificate_chain_file(self, certfile): - """ - Load a certificate chain from a file - - :param certfile: The name of the certificate chain file - :return: None - """ - if isinstance(certfile, _text_type): - # Perhaps sys.getfilesystemencoding() could be better? - certfile = certfile.encode("utf-8") - - if not isinstance(certfile, bytes): - raise TypeError("certfile must be bytes or unicode") - - result = _lib.SSL_CTX_use_certificate_chain_file(self._context, certfile) - if not result: - _raise_current_error() - - - def use_certificate_file(self, certfile, filetype=FILETYPE_PEM): - """ - Load a certificate from a file - - :param certfile: The name of the certificate file - :param filetype: (optional) The encoding of the file, default is PEM - :return: None - """ - if isinstance(certfile, _text_type): - # Perhaps sys.getfilesystemencoding() could be better? - certfile = certfile.encode("utf-8") - if not isinstance(certfile, bytes): - raise TypeError("certfile must be bytes or unicode") - if not isinstance(filetype, integer_types): - raise TypeError("filetype must be an integer") - - use_result = _lib.SSL_CTX_use_certificate_file(self._context, certfile, filetype) - if not use_result: - _raise_current_error() - - - def use_certificate(self, cert): - """ - Load a certificate from a X509 object - - :param cert: The X509 object - :return: None - """ - if not isinstance(cert, X509): - raise TypeError("cert must be an X509 instance") - - use_result = _lib.SSL_CTX_use_certificate(self._context, cert._x509) - if not use_result: - _raise_current_error() - - - def add_extra_chain_cert(self, certobj): - """ - Add certificate to chain - - :param certobj: The X509 certificate object to add to the chain - :return: None - """ - if not isinstance(certobj, X509): - raise TypeError("certobj must be an X509 instance") - - copy = _lib.X509_dup(certobj._x509) - add_result = _lib.SSL_CTX_add_extra_chain_cert(self._context, copy) - if not add_result: - # TODO: This is untested. - _lib.X509_free(copy) - _raise_current_error() - - - def _raise_passphrase_exception(self): - if self._passphrase_helper is None: - _raise_current_error() - exception = self._passphrase_helper.raise_if_problem(Error) - if exception is not None: - raise exception - - - def use_privatekey_file(self, keyfile, filetype=_unspecified): - """ - Load a private key from a file - - :param keyfile: The name of the key file - :param filetype: (optional) The encoding of the file, default is PEM - :return: None - """ - if isinstance(keyfile, _text_type): - # Perhaps sys.getfilesystemencoding() could be better? - keyfile = keyfile.encode("utf-8") - - if not isinstance(keyfile, bytes): - raise TypeError("keyfile must be a byte string") - - if filetype is _unspecified: - filetype = FILETYPE_PEM - elif not isinstance(filetype, integer_types): - raise TypeError("filetype must be an integer") - - use_result = _lib.SSL_CTX_use_PrivateKey_file( - self._context, keyfile, filetype) - if not use_result: - self._raise_passphrase_exception() - - - def use_privatekey(self, pkey): - """ - Load a private key from a PKey object - - :param pkey: The PKey object - :return: None - """ - if not isinstance(pkey, PKey): - raise TypeError("pkey must be a PKey instance") - - use_result = _lib.SSL_CTX_use_PrivateKey(self._context, pkey._pkey) - if not use_result: - self._raise_passphrase_exception() - - - def check_privatekey(self): - """ - Check that the private key and certificate match up - - :return: None (raises an exception if something's wrong) - """ - - def load_client_ca(self, cafile): - """ - Load the trusted certificates that will be sent to the client (basically - telling the client "These are the guys I trust"). Does not actually - imply any of the certificates are trusted; that must be configured - separately. - - :param cafile: The name of the certificates file - :return: None - """ - - def set_session_id(self, buf): - """ - Set the session identifier. This is needed if you want to do session - resumption. - - :param buf: A Python object that can be safely converted to a string - :returns: None - """ - - def set_session_cache_mode(self, mode): - """ - Enable/disable session caching and specify the mode used. - - :param mode: One or more of the SESS_CACHE_* flags (combine using - bitwise or) - :returns: The previously set caching mode. - """ - if not isinstance(mode, integer_types): - raise TypeError("mode must be an integer") - - return _lib.SSL_CTX_set_session_cache_mode(self._context, mode) - - - def get_session_cache_mode(self): - """ - :returns: The currently used cache mode. - """ - return _lib.SSL_CTX_get_session_cache_mode(self._context) - - - def set_verify(self, mode, callback): - """ - Set the verify mode and verify callback - - :param mode: The verify mode, this is either VERIFY_NONE or - VERIFY_PEER combined with possible other flags - :param callback: The Python callback to use - :return: None - - See SSL_CTX_set_verify(3SSL) for further details. - """ - if not isinstance(mode, integer_types): - raise TypeError("mode must be an integer") - - if not callable(callback): - raise TypeError("callback must be callable") - - self._verify_helper = _VerifyHelper(self, callback) - self._verify_callback = self._verify_helper.callback - _lib.SSL_CTX_set_verify(self._context, mode, self._verify_callback) - - - def set_verify_depth(self, depth): - """ - Set the verify depth - - :param depth: An integer specifying the verify depth - :return: None - """ - if not isinstance(depth, integer_types): - raise TypeError("depth must be an integer") - - _lib.SSL_CTX_set_verify_depth(self._context, depth) - - - def get_verify_mode(self): - """ - Get the verify mode - - :return: The verify mode - """ - return _lib.SSL_CTX_get_verify_mode(self._context) - - - def get_verify_depth(self): - """ - Get the verify depth - - :return: The verify depth - """ - return _lib.SSL_CTX_get_verify_depth(self._context) - - - def load_tmp_dh(self, dhfile): - """ - Load parameters for Ephemeral Diffie-Hellman - - :param dhfile: The file to load EDH parameters from - :return: None - """ - if not isinstance(dhfile, bytes): - raise TypeError("dhfile must be a byte string") - - bio = _lib.BIO_new_file(dhfile, b"r") - if bio == _ffi.NULL: - _raise_current_error() - bio = _ffi.gc(bio, _lib.BIO_free) - - dh = _lib.PEM_read_bio_DHparams(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL) - dh = _ffi.gc(dh, _lib.DH_free) - _lib.SSL_CTX_set_tmp_dh(self._context, dh) - - - def set_cipher_list(self, cipher_list): - """ - Change the cipher list - - :param cipher_list: A cipher list, see ciphers(1) - :return: None - """ - if isinstance(cipher_list, _text_type): - cipher_list = cipher_list.encode("ascii") - - if not isinstance(cipher_list, bytes): - raise TypeError("cipher_list must be bytes or unicode") - - result = _lib.SSL_CTX_set_cipher_list(self._context, cipher_list) - if not result: - _raise_current_error() - - - def set_client_ca_list(self, certificate_authorities): - """ - Set the list of preferred client certificate signers for this server context. - - This list of certificate authorities will be sent to the client when the - server requests a client certificate. - - :param certificate_authorities: a sequence of X509Names. - :return: None - """ - name_stack = _lib.sk_X509_NAME_new_null() - if name_stack == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - try: - for ca_name in certificate_authorities: - if not isinstance(ca_name, X509Name): - raise TypeError( - "client CAs must be X509Name objects, not %s objects" % ( - type(ca_name).__name__,)) - copy = _lib.X509_NAME_dup(ca_name._name) - if copy == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - push_result = _lib.sk_X509_NAME_push(name_stack, copy) - if not push_result: - _lib.X509_NAME_free(copy) - _raise_current_error() - except: - _lib.sk_X509_NAME_free(name_stack) - raise - - _lib.SSL_CTX_set_client_CA_list(self._context, name_stack) - - - def add_client_ca(self, certificate_authority): - """ - Add the CA certificate to the list of preferred signers for this context. - - The list of certificate authorities will be sent to the client when the - server requests a client certificate. - - :param certificate_authority: certificate authority's X509 certificate. - :return: None - """ - if not isinstance(certificate_authority, X509): - raise TypeError("certificate_authority must be an X509 instance") - - add_result = _lib.SSL_CTX_add_client_CA( - self._context, certificate_authority._x509) - if not add_result: - # TODO: This is untested. - _raise_current_error() - - - def set_timeout(self, timeout): - """ - Set session timeout - - :param timeout: The timeout in seconds - :return: The previous session timeout - """ - if not isinstance(timeout, integer_types): - raise TypeError("timeout must be an integer") - - return _lib.SSL_CTX_set_timeout(self._context, timeout) - - - def get_timeout(self): - """ - Get the session timeout - - :return: The session timeout - """ - return _lib.SSL_CTX_get_timeout(self._context) - - - def set_info_callback(self, callback): - """ - Set the info callback - - :param callback: The Python callback to use - :return: None - """ - @wraps(callback) - def wrapper(ssl, where, return_code): - callback(Connection._reverse_mapping[ssl], where, return_code) - self._info_callback = _ffi.callback( - "void (*)(const SSL *, int, int)", wrapper) - _lib.SSL_CTX_set_info_callback(self._context, self._info_callback) - - - def get_app_data(self): - """ - Get the application data (supplied via set_app_data()) - - :return: The application data - """ - return self._app_data - - - def set_app_data(self, data): - """ - Set the application data (will be returned from get_app_data()) - - :param data: Any Python object - :return: None - """ - self._app_data = data - - - def get_cert_store(self): - """ - Get the certificate store for the context. - - :return: A X509Store object or None if it does not have one. - """ - store = _lib.SSL_CTX_get_cert_store(self._context) - if store == _ffi.NULL: - # TODO: This is untested. - return None - - pystore = X509Store.__new__(X509Store) - pystore._store = store - return pystore - - - def set_options(self, options): - """ - Add options. Options set before are not cleared! - - :param options: The options to add. - :return: The new option bitmask. - """ - if not isinstance(options, integer_types): - raise TypeError("options must be an integer") - - return _lib.SSL_CTX_set_options(self._context, options) - - - def set_mode(self, mode): - """ - Add modes via bitmask. Modes set before are not cleared! - - :param mode: The mode to add. - :return: The new mode bitmask. - """ - if not isinstance(mode, integer_types): - raise TypeError("mode must be an integer") - - return _lib.SSL_CTX_set_mode(self._context, mode) - - - def set_tlsext_servername_callback(self, callback): - """ - Specify a callback function to be called when clients specify a server name. - - :param callback: The callback function. It will be invoked with one - argument, the Connection instance. - """ - @wraps(callback) - def wrapper(ssl, alert, arg): - callback(Connection._reverse_mapping[ssl]) - return 0 - - self._tlsext_servername_callback = _ffi.callback( - "int (*)(const SSL *, int *, void *)", wrapper) - _lib.SSL_CTX_set_tlsext_servername_callback( - self._context, self._tlsext_servername_callback) - -ContextType = Context - - - -class Connection(object): - """ - """ - _reverse_mapping = WeakValueDictionary() - - def __init__(self, context, socket=None): - """ - Create a new Connection object, using the given OpenSSL.SSL.Context - instance and socket. - - :param context: An SSL Context to use for this connection - :param socket: The socket to use for transport layer - """ - if not isinstance(context, Context): - raise TypeError("context must be a Context instance") - - ssl = _lib.SSL_new(context._context) - self._ssl = _ffi.gc(ssl, _lib.SSL_free) - self._context = context - - self._reverse_mapping[self._ssl] = self - - if socket is None: - self._socket = None - # Don't set up any gc for these, SSL_free will take care of them. - self._into_ssl = _lib.BIO_new(_lib.BIO_s_mem()) - self._from_ssl = _lib.BIO_new(_lib.BIO_s_mem()) - - if self._into_ssl == _ffi.NULL or self._from_ssl == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - _lib.SSL_set_bio(self._ssl, self._into_ssl, self._from_ssl) - else: - self._into_ssl = None - self._from_ssl = None - self._socket = socket - set_result = _lib.SSL_set_fd(self._ssl, _asFileDescriptor(self._socket)) - if not set_result: - # TODO: This is untested. - _raise_current_error() - - - def __getattr__(self, name): - """ - Look up attributes on the wrapped socket object if they are not found on - the Connection object. - """ - return getattr(self._socket, name) - - - def _raise_ssl_error(self, ssl, result): - if self._context._verify_helper is not None: - self._context._verify_helper.raise_if_problem() - - error = _lib.SSL_get_error(ssl, result) - if error == _lib.SSL_ERROR_WANT_READ: - raise WantReadError() - elif error == _lib.SSL_ERROR_WANT_WRITE: - raise WantWriteError() - elif error == _lib.SSL_ERROR_ZERO_RETURN: - raise ZeroReturnError() - elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP: - # TODO: This is untested. - raise WantX509LookupError() - elif error == _lib.SSL_ERROR_SYSCALL: - if _lib.ERR_peek_error() == 0: - if result < 0: - if platform == "win32": - errno = _ffi.getwinerror()[0] - else: - errno = _ffi.errno - raise SysCallError(errno, errorcode[errno]) - else: - raise SysCallError(-1, "Unexpected EOF") - else: - # TODO: This is untested. - _raise_current_error() - elif error == _lib.SSL_ERROR_NONE: - pass - else: - _raise_current_error() - - - def get_context(self): - """ - Get session context - """ - return self._context - - - def set_context(self, context): - """ - Switch this connection to a new session context - - :param context: A :py:class:`Context` instance giving the new session - context to use. - """ - if not isinstance(context, Context): - raise TypeError("context must be a Context instance") - - _lib.SSL_set_SSL_CTX(self._ssl, context._context) - self._context = context - - - def get_servername(self): - """ - Retrieve the servername extension value if provided in the client hello - message, or None if there wasn't one. - - :return: A byte string giving the server name or :py:data:`None`. - """ - name = _lib.SSL_get_servername(self._ssl, _lib.TLSEXT_NAMETYPE_host_name) - if name == _ffi.NULL: - return None - - return _ffi.string(name) - - - def set_tlsext_host_name(self, name): - """ - Set the value of the servername extension to send in the client hello. - - :param name: A byte string giving the name. - """ - if not isinstance(name, bytes): - raise TypeError("name must be a byte string") - elif b"\0" in name: - raise TypeError("name must not contain NUL byte") - - # XXX I guess this can fail sometimes? - _lib.SSL_set_tlsext_host_name(self._ssl, name) - - - def pending(self): - """ - Get the number of bytes that can be safely read from the connection - - :return: The number of bytes available in the receive buffer. - """ - return _lib.SSL_pending(self._ssl) - - - def send(self, buf, flags=0): - """ - Send data on the connection. NOTE: If you get one of the WantRead, - WantWrite or WantX509Lookup exceptions on this, you have to call the - method again with the SAME buffer. - - :param buf: The string to send - :param flags: (optional) Included for compatibility with the socket - API, the value is ignored - :return: The number of bytes written - """ - if isinstance(buf, _memoryview): - buf = buf.tobytes() - if not isinstance(buf, bytes): - raise TypeError("data must be a byte string") - - result = _lib.SSL_write(self._ssl, buf, len(buf)) - self._raise_ssl_error(self._ssl, result) - return result - write = send - - - def sendall(self, buf, flags=0): - """ - Send "all" data on the connection. This calls send() repeatedly until - all data is sent. If an error occurs, it's impossible to tell how much - data has been sent. - - :param buf: The string to send - :param flags: (optional) Included for compatibility with the socket - API, the value is ignored - :return: The number of bytes written - """ - if isinstance(buf, _memoryview): - buf = buf.tobytes() - if not isinstance(buf, bytes): - raise TypeError("buf must be a byte string") - - left_to_send = len(buf) - total_sent = 0 - data = _ffi.new("char[]", buf) - - while left_to_send: - result = _lib.SSL_write(self._ssl, data + total_sent, left_to_send) - self._raise_ssl_error(self._ssl, result) - total_sent += result - left_to_send -= result - - - def recv(self, bufsiz, flags=None): - """ - Receive data on the connection. NOTE: If you get one of the WantRead, - WantWrite or WantX509Lookup exceptions on this, you have to call the - method again with the SAME buffer. - - :param bufsiz: The maximum number of bytes to read - :param flags: (optional) Included for compatibility with the socket - API, the value is ignored - :return: The string read from the Connection - """ - buf = _ffi.new("char[]", bufsiz) - result = _lib.SSL_read(self._ssl, buf, bufsiz) - self._raise_ssl_error(self._ssl, result) - return _ffi.buffer(buf, result)[:] - read = recv - - - def _handle_bio_errors(self, bio, result): - if _lib.BIO_should_retry(bio): - if _lib.BIO_should_read(bio): - raise WantReadError() - elif _lib.BIO_should_write(bio): - # TODO: This is untested. - raise WantWriteError() - elif _lib.BIO_should_io_special(bio): - # TODO: This is untested. I think io_special means the socket - # BIO has a not-yet connected socket. - raise ValueError("BIO_should_io_special") - else: - # TODO: This is untested. - raise ValueError("unknown bio failure") - else: - # TODO: This is untested. - _raise_current_error() - - - def bio_read(self, bufsiz): - """ - When using non-socket connections this function reads the "dirty" data - that would have traveled away on the network. - - :param bufsiz: The maximum number of bytes to read - :return: The string read. - """ - if self._from_ssl is None: - raise TypeError("Connection sock was not None") - - if not isinstance(bufsiz, integer_types): - raise TypeError("bufsiz must be an integer") - - buf = _ffi.new("char[]", bufsiz) - result = _lib.BIO_read(self._from_ssl, buf, bufsiz) - if result <= 0: - self._handle_bio_errors(self._from_ssl, result) - - return _ffi.buffer(buf, result)[:] - - - def bio_write(self, buf): - """ - When using non-socket connections this function sends "dirty" data that - would have traveled in on the network. - - :param buf: The string to put into the memory BIO. - :return: The number of bytes written - """ - if self._into_ssl is None: - raise TypeError("Connection sock was not None") - - if not isinstance(buf, bytes): - raise TypeError("buf must be a byte string") - - result = _lib.BIO_write(self._into_ssl, buf, len(buf)) - if result <= 0: - self._handle_bio_errors(self._into_ssl, result) - return result - - - def renegotiate(self): - """ - Renegotiate the session - - :return: True if the renegotiation can be started, false otherwise - """ - - def do_handshake(self): - """ - Perform an SSL handshake (usually called after renegotiate() or one of - set_*_state()). This can raise the same exceptions as send and recv. - - :return: None. - """ - result = _lib.SSL_do_handshake(self._ssl) - self._raise_ssl_error(self._ssl, result) - - - def renegotiate_pending(self): - """ - Check if there's a renegotiation in progress, it will return false once - a renegotiation is finished. - - :return: Whether there's a renegotiation in progress - """ - - def total_renegotiations(self): - """ - Find out the total number of renegotiations. - - :return: The number of renegotiations. - """ - return _lib.SSL_total_renegotiations(self._ssl) - - - def connect(self, addr): - """ - Connect to remote host and set up client-side SSL - - :param addr: A remote address - :return: What the socket's connect method returns - """ - _lib.SSL_set_connect_state(self._ssl) - return self._socket.connect(addr) - - - def connect_ex(self, addr): - """ - Connect to remote host and set up client-side SSL. Note that if the socket's - connect_ex method doesn't return 0, SSL won't be initialized. - - :param addr: A remove address - :return: What the socket's connect_ex method returns - """ - connect_ex = self._socket.connect_ex - self.set_connect_state() - return connect_ex(addr) - - - def accept(self): - """ - Accept incoming connection and set up SSL on it - - :return: A (conn,addr) pair where conn is a Connection and addr is an - address - """ - client, addr = self._socket.accept() - conn = Connection(self._context, client) - conn.set_accept_state() - return (conn, addr) - - - def bio_shutdown(self): - """ - When using non-socket connections this function signals end of - data on the input for this connection. - - :return: None - """ - if self._from_ssl is None: - raise TypeError("Connection sock was not None") - - _lib.BIO_set_mem_eof_return(self._into_ssl, 0) - - - def shutdown(self): - """ - Send closure alert - - :return: True if the shutdown completed successfully (i.e. both sides - have sent closure alerts), false otherwise (i.e. you have to - wait for a ZeroReturnError on a recv() method call - """ - result = _lib.SSL_shutdown(self._ssl) - if result < 0: - # TODO: This is untested. - _raise_current_error() - elif result > 0: - return True - else: - return False - - - def get_cipher_list(self): - """ - Get the session cipher list - - :return: A list of cipher strings - """ - ciphers = [] - for i in count(): - result = _lib.SSL_get_cipher_list(self._ssl, i) - if result == _ffi.NULL: - break - ciphers.append(_native(_ffi.string(result))) - return ciphers - - - def get_client_ca_list(self): - """ - Get CAs whose certificates are suggested for client authentication. - - :return: If this is a server connection, a list of X509Names representing - the acceptable CAs as set by :py:meth:`OpenSSL.SSL.Context.set_client_ca_list` or - :py:meth:`OpenSSL.SSL.Context.add_client_ca`. If this is a client connection, - the list of such X509Names sent by the server, or an empty list if that - has not yet happened. - """ - ca_names = _lib.SSL_get_client_CA_list(self._ssl) - if ca_names == _ffi.NULL: - # TODO: This is untested. - return [] - - result = [] - for i in range(_lib.sk_X509_NAME_num(ca_names)): - name = _lib.sk_X509_NAME_value(ca_names, i) - copy = _lib.X509_NAME_dup(name) - if copy == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - pyname = X509Name.__new__(X509Name) - pyname._name = _ffi.gc(copy, _lib.X509_NAME_free) - result.append(pyname) - return result - - - def makefile(self): - """ - The makefile() method is not implemented, since there is no dup semantics - for SSL connections - - :raise NotImplementedError - """ - raise NotImplementedError("Cannot make file object of OpenSSL.SSL.Connection") - - - def get_app_data(self): - """ - Get application data - - :return: The application data - """ - return self._app_data - - - def set_app_data(self, data): - """ - Set application data - - :param data - The application data - :return: None - """ - self._app_data = data - - - def get_shutdown(self): - """ - Get shutdown state - - :return: The shutdown state, a bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN. - """ - return _lib.SSL_get_shutdown(self._ssl) - - - def set_shutdown(self, state): - """ - Set shutdown state - - :param state - bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN. - :return: None - """ - if not isinstance(state, integer_types): - raise TypeError("state must be an integer") - - _lib.SSL_set_shutdown(self._ssl, state) - - - def state_string(self): - """ - Get a verbose state description - - :return: A string representing the state - """ - - def server_random(self): - """ - Get a copy of the server hello nonce. - - :return: A string representing the state - """ - if self._ssl.session == _ffi.NULL: - return None - return _ffi.buffer( - self._ssl.s3.server_random, - _lib.SSL3_RANDOM_SIZE)[:] - - - def client_random(self): - """ - Get a copy of the client hello nonce. - - :return: A string representing the state - """ - if self._ssl.session == _ffi.NULL: - return None - return _ffi.buffer( - self._ssl.s3.client_random, - _lib.SSL3_RANDOM_SIZE)[:] - - - def master_key(self): - """ - Get a copy of the master key. - - :return: A string representing the state - """ - if self._ssl.session == _ffi.NULL: - return None - return _ffi.buffer( - self._ssl.session.master_key, - self._ssl.session.master_key_length)[:] - - - def sock_shutdown(self, *args, **kwargs): - """ - See shutdown(2) - - :return: What the socket's shutdown() method returns - """ - return self._socket.shutdown(*args, **kwargs) - - - def get_peer_certificate(self): - """ - Retrieve the other side's certificate (if any) - - :return: The peer's certificate - """ - cert = _lib.SSL_get_peer_certificate(self._ssl) - if cert != _ffi.NULL: - pycert = X509.__new__(X509) - pycert._x509 = _ffi.gc(cert, _lib.X509_free) - return pycert - return None - - - def get_peer_cert_chain(self): - """ - Retrieve the other side's certificate (if any) - - :return: A list of X509 instances giving the peer's certificate chain, - or None if it does not have one. - """ - cert_stack = _lib.SSL_get_peer_cert_chain(self._ssl) - if cert_stack == _ffi.NULL: - return None - - result = [] - for i in range(_lib.sk_X509_num(cert_stack)): - # TODO could incref instead of dup here - cert = _lib.X509_dup(_lib.sk_X509_value(cert_stack, i)) - pycert = X509.__new__(X509) - pycert._x509 = _ffi.gc(cert, _lib.X509_free) - result.append(pycert) - return result - - - def want_read(self): - """ - Checks if more data has to be read from the transport layer to complete an - operation. - - :return: True iff more data has to be read - """ - return _lib.SSL_want_read(self._ssl) - - - def want_write(self): - """ - Checks if there is data to write to the transport layer to complete an - operation. - - :return: True iff there is data to write - """ - return _lib.SSL_want_write(self._ssl) - - - def set_accept_state(self): - """ - Set the connection to work in server mode. The handshake will be handled - automatically by read/write. - - :return: None - """ - _lib.SSL_set_accept_state(self._ssl) - - - def set_connect_state(self): - """ - Set the connection to work in client mode. The handshake will be handled - automatically by read/write. - - :return: None - """ - _lib.SSL_set_connect_state(self._ssl) - - - def get_session(self): - """ - Returns the Session currently used. - - @return: An instance of :py:class:`OpenSSL.SSL.Session` or :py:obj:`None` if - no session exists. - """ - session = _lib.SSL_get1_session(self._ssl) - if session == _ffi.NULL: - return None - - pysession = Session.__new__(Session) - pysession._session = _ffi.gc(session, _lib.SSL_SESSION_free) - return pysession - - - def set_session(self, session): - """ - Set the session to be used when the TLS/SSL connection is established. - - :param session: A Session instance representing the session to use. - :returns: None - """ - if not isinstance(session, Session): - raise TypeError("session must be a Session instance") - - result = _lib.SSL_set_session(self._ssl, session._session) - if not result: - _raise_current_error() - -ConnectionType = Connection - -# This is similar to the initialization calls at the end of OpenSSL/crypto.py -# but is exercised mostly by the Context initializer. -_lib.SSL_library_init() diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/__init__.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/__init__.py deleted file mode 100644 index db96e1f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (C) AB Strakt -# See LICENSE for details. - -""" -pyOpenSSL - A simple wrapper around the OpenSSL library -""" - -from OpenSSL import rand, crypto, SSL -from OpenSSL.version import __version__ - -__all__ = [ - 'rand', 'crypto', 'SSL', 'tsafe', '__version__'] diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/_util.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/_util.py deleted file mode 100644 index baeecc6..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/_util.py +++ /dev/null @@ -1,53 +0,0 @@ -from six import PY3, binary_type, text_type - -from cryptography.hazmat.bindings.openssl.binding import Binding -binding = Binding() -ffi = binding.ffi -lib = binding.lib - -def exception_from_error_queue(exceptionType): - def text(charp): - return native(ffi.string(charp)) - - errors = [] - while True: - error = lib.ERR_get_error() - if error == 0: - break - errors.append(( - text(lib.ERR_lib_error_string(error)), - text(lib.ERR_func_error_string(error)), - text(lib.ERR_reason_error_string(error)))) - - raise exceptionType(errors) - - - -def native(s): - """ - Convert :py:class:`bytes` or :py:class:`unicode` to the native - :py:class:`str` type, using UTF-8 encoding if conversion is necessary. - - :raise UnicodeError: The input string is not UTF-8 decodeable. - - :raise TypeError: The input is neither :py:class:`bytes` nor - :py:class:`unicode`. - """ - if not isinstance(s, (binary_type, text_type)): - raise TypeError("%r is neither bytes nor unicode" % s) - if PY3: - if isinstance(s, binary_type): - return s.decode("utf-8") - else: - if isinstance(s, text_type): - return s.encode("utf-8") - return s - - - -if PY3: - def byte_string(s): - return s.encode("charmap") -else: - def byte_string(s): - return s diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/crypto.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/crypto.py deleted file mode 100644 index d0026bd..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/crypto.py +++ /dev/null @@ -1,2314 +0,0 @@ -from time import time -from base64 import b16encode -from functools import partial -from operator import __eq__, __ne__, __lt__, __le__, __gt__, __ge__ - -from six import ( - integer_types as _integer_types, - text_type as _text_type) - -from OpenSSL._util import ( - ffi as _ffi, - lib as _lib, - exception_from_error_queue as _exception_from_error_queue, - byte_string as _byte_string, - native as _native) - -FILETYPE_PEM = _lib.SSL_FILETYPE_PEM -FILETYPE_ASN1 = _lib.SSL_FILETYPE_ASN1 - -# TODO This was an API mistake. OpenSSL has no such constant. -FILETYPE_TEXT = 2 ** 16 - 1 - -TYPE_RSA = _lib.EVP_PKEY_RSA -TYPE_DSA = _lib.EVP_PKEY_DSA - - -class Error(Exception): - """ - An error occurred in an `OpenSSL.crypto` API. - """ - - -_raise_current_error = partial(_exception_from_error_queue, Error) - -def _untested_error(where): - """ - An OpenSSL API failed somehow. Additionally, the failure which was - encountered isn't one that's exercised by the test suite so future behavior - of pyOpenSSL is now somewhat less predictable. - """ - raise RuntimeError("Unknown %s failure" % (where,)) - - - -def _new_mem_buf(buffer=None): - """ - Allocate a new OpenSSL memory BIO. - - Arrange for the garbage collector to clean it up automatically. - - :param buffer: None or some bytes to use to put into the BIO so that they - can be read out. - """ - if buffer is None: - bio = _lib.BIO_new(_lib.BIO_s_mem()) - free = _lib.BIO_free - else: - data = _ffi.new("char[]", buffer) - bio = _lib.BIO_new_mem_buf(data, len(buffer)) - # Keep the memory alive as long as the bio is alive! - def free(bio, ref=data): - return _lib.BIO_free(bio) - - if bio == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - bio = _ffi.gc(bio, free) - return bio - - - -def _bio_to_string(bio): - """ - Copy the contents of an OpenSSL BIO object into a Python byte string. - """ - result_buffer = _ffi.new('char**') - buffer_length = _lib.BIO_get_mem_data(bio, result_buffer) - return _ffi.buffer(result_buffer[0], buffer_length)[:] - - - -def _set_asn1_time(boundary, when): - """ - The the time value of an ASN1 time object. - - @param boundary: An ASN1_GENERALIZEDTIME pointer (or an object safely - castable to that type) which will have its value set. - @param when: A string representation of the desired time value. - - @raise TypeError: If C{when} is not a L{bytes} string. - @raise ValueError: If C{when} does not represent a time in the required - format. - @raise RuntimeError: If the time value cannot be set for some other - (unspecified) reason. - """ - if not isinstance(when, bytes): - raise TypeError("when must be a byte string") - - set_result = _lib.ASN1_GENERALIZEDTIME_set_string( - _ffi.cast('ASN1_GENERALIZEDTIME*', boundary), when) - if set_result == 0: - dummy = _ffi.gc(_lib.ASN1_STRING_new(), _lib.ASN1_STRING_free) - _lib.ASN1_STRING_set(dummy, when, len(when)) - check_result = _lib.ASN1_GENERALIZEDTIME_check( - _ffi.cast('ASN1_GENERALIZEDTIME*', dummy)) - if not check_result: - raise ValueError("Invalid string") - else: - _untested_error() - - - -def _get_asn1_time(timestamp): - """ - Retrieve the time value of an ASN1 time object. - - @param timestamp: An ASN1_GENERALIZEDTIME* (or an object safely castable to - that type) from which the time value will be retrieved. - - @return: The time value from C{timestamp} as a L{bytes} string in a certain - format. Or C{None} if the object contains no time value. - """ - string_timestamp = _ffi.cast('ASN1_STRING*', timestamp) - if _lib.ASN1_STRING_length(string_timestamp) == 0: - return None - elif _lib.ASN1_STRING_type(string_timestamp) == _lib.V_ASN1_GENERALIZEDTIME: - return _ffi.string(_lib.ASN1_STRING_data(string_timestamp)) - else: - generalized_timestamp = _ffi.new("ASN1_GENERALIZEDTIME**") - _lib.ASN1_TIME_to_generalizedtime(timestamp, generalized_timestamp) - if generalized_timestamp[0] == _ffi.NULL: - # This may happen: - # - if timestamp was not an ASN1_TIME - # - if allocating memory for the ASN1_GENERALIZEDTIME failed - # - if a copy of the time data from timestamp cannot be made for - # the newly allocated ASN1_GENERALIZEDTIME - # - # These are difficult to test. cffi enforces the ASN1_TIME type. - # Memory allocation failures are a pain to trigger - # deterministically. - _untested_error("ASN1_TIME_to_generalizedtime") - else: - string_timestamp = _ffi.cast( - "ASN1_STRING*", generalized_timestamp[0]) - string_data = _lib.ASN1_STRING_data(string_timestamp) - string_result = _ffi.string(string_data) - _lib.ASN1_GENERALIZEDTIME_free(generalized_timestamp[0]) - return string_result - - - -class PKey(object): - _only_public = False - _initialized = True - - def __init__(self): - pkey = _lib.EVP_PKEY_new() - self._pkey = _ffi.gc(pkey, _lib.EVP_PKEY_free) - self._initialized = False - - - def generate_key(self, type, bits): - """ - Generate a key of a given type, with a given number of a bits - - :param type: The key type (TYPE_RSA or TYPE_DSA) - :param bits: The number of bits - - :return: None - """ - if not isinstance(type, int): - raise TypeError("type must be an integer") - - if not isinstance(bits, int): - raise TypeError("bits must be an integer") - - # TODO Check error return - exponent = _lib.BN_new() - exponent = _ffi.gc(exponent, _lib.BN_free) - _lib.BN_set_word(exponent, _lib.RSA_F4) - - if type == TYPE_RSA: - if bits <= 0: - raise ValueError("Invalid number of bits") - - rsa = _lib.RSA_new() - - result = _lib.RSA_generate_key_ex(rsa, bits, exponent, _ffi.NULL) - if result == 0: - # TODO: The test for this case is commented out. Different - # builds of OpenSSL appear to have different failure modes that - # make it hard to test. Visual inspection of the OpenSSL - # source reveals that a return value of 0 signals an error. - # Manual testing on a particular build of OpenSSL suggests that - # this is probably the appropriate way to handle those errors. - _raise_current_error() - - result = _lib.EVP_PKEY_assign_RSA(self._pkey, rsa) - if not result: - # TODO: It appears as though this can fail if an engine is in - # use which does not support RSA. - _raise_current_error() - - elif type == TYPE_DSA: - dsa = _lib.DSA_generate_parameters( - bits, _ffi.NULL, 0, _ffi.NULL, _ffi.NULL, _ffi.NULL, _ffi.NULL) - if dsa == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - if not _lib.DSA_generate_key(dsa): - # TODO: This is untested. - _raise_current_error() - if not _lib.EVP_PKEY_assign_DSA(self._pkey, dsa): - # TODO: This is untested. - _raise_current_error() - else: - raise Error("No such key type") - - self._initialized = True - - - def check(self): - """ - Check the consistency of an RSA private key. - - :return: True if key is consistent. - :raise Error: if the key is inconsistent. - :raise TypeError: if the key is of a type which cannot be checked. - Only RSA keys can currently be checked. - """ - if self._only_public: - raise TypeError("public key only") - - if _lib.EVP_PKEY_type(self._pkey.type) != _lib.EVP_PKEY_RSA: - raise TypeError("key type unsupported") - - rsa = _lib.EVP_PKEY_get1_RSA(self._pkey) - rsa = _ffi.gc(rsa, _lib.RSA_free) - result = _lib.RSA_check_key(rsa) - if result: - return True - _raise_current_error() - - - def type(self): - """ - Returns the type of the key - - :return: The type of the key. - """ - return self._pkey.type - - - def bits(self): - """ - Returns the number of bits of the key - - :return: The number of bits of the key. - """ - return _lib.EVP_PKEY_bits(self._pkey) -PKeyType = PKey - - - -class X509Name(object): - def __init__(self, name): - """ - Create a new X509Name, copying the given X509Name instance. - - :param name: An X509Name object to copy - """ - name = _lib.X509_NAME_dup(name._name) - self._name = _ffi.gc(name, _lib.X509_NAME_free) - - - def __setattr__(self, name, value): - if name.startswith('_'): - return super(X509Name, self).__setattr__(name, value) - - # Note: we really do not want str subclasses here, so we do not use - # isinstance. - if type(name) is not str: - raise TypeError("attribute name must be string, not '%.200s'" % ( - type(value).__name__,)) - - nid = _lib.OBJ_txt2nid(_byte_string(name)) - if nid == _lib.NID_undef: - try: - _raise_current_error() - except Error: - pass - raise AttributeError("No such attribute") - - # If there's an old entry for this NID, remove it - for i in range(_lib.X509_NAME_entry_count(self._name)): - ent = _lib.X509_NAME_get_entry(self._name, i) - ent_obj = _lib.X509_NAME_ENTRY_get_object(ent) - ent_nid = _lib.OBJ_obj2nid(ent_obj) - if nid == ent_nid: - ent = _lib.X509_NAME_delete_entry(self._name, i) - _lib.X509_NAME_ENTRY_free(ent) - break - - if isinstance(value, _text_type): - value = value.encode('utf-8') - - add_result = _lib.X509_NAME_add_entry_by_NID( - self._name, nid, _lib.MBSTRING_UTF8, value, -1, -1, 0) - if not add_result: - _raise_current_error() - - - def __getattr__(self, name): - """ - Find attribute. An X509Name object has the following attributes: - countryName (alias C), stateOrProvince (alias ST), locality (alias L), - organization (alias O), organizationalUnit (alias OU), commonName (alias - CN) and more... - """ - nid = _lib.OBJ_txt2nid(_byte_string(name)) - if nid == _lib.NID_undef: - # This is a bit weird. OBJ_txt2nid indicated failure, but it seems - # a lower level function, a2d_ASN1_OBJECT, also feels the need to - # push something onto the error queue. If we don't clean that up - # now, someone else will bump into it later and be quite confused. - # See lp#314814. - try: - _raise_current_error() - except Error: - pass - return super(X509Name, self).__getattr__(name) - - entry_index = _lib.X509_NAME_get_index_by_NID(self._name, nid, -1) - if entry_index == -1: - return None - - entry = _lib.X509_NAME_get_entry(self._name, entry_index) - data = _lib.X509_NAME_ENTRY_get_data(entry) - - result_buffer = _ffi.new("unsigned char**") - data_length = _lib.ASN1_STRING_to_UTF8(result_buffer, data) - if data_length < 0: - # TODO: This is untested. - _raise_current_error() - - try: - result = _ffi.buffer(result_buffer[0], data_length)[:].decode('utf-8') - finally: - # XXX untested - _lib.OPENSSL_free(result_buffer[0]) - return result - - - def _cmp(op): - def f(self, other): - if not isinstance(other, X509Name): - return NotImplemented - result = _lib.X509_NAME_cmp(self._name, other._name) - return op(result, 0) - return f - - __eq__ = _cmp(__eq__) - __ne__ = _cmp(__ne__) - - __lt__ = _cmp(__lt__) - __le__ = _cmp(__le__) - - __gt__ = _cmp(__gt__) - __ge__ = _cmp(__ge__) - - def __repr__(self): - """ - String representation of an X509Name - """ - result_buffer = _ffi.new("char[]", 512); - format_result = _lib.X509_NAME_oneline( - self._name, result_buffer, len(result_buffer)) - - if format_result == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - return "" % ( - _native(_ffi.string(result_buffer)),) - - - def hash(self): - """ - Return the hash value of this name - - :return: None - """ - return _lib.X509_NAME_hash(self._name) - - - def der(self): - """ - Return the DER encoding of this name - - :return: A :py:class:`bytes` instance giving the DER encoded form of - this name. - """ - result_buffer = _ffi.new('unsigned char**') - encode_result = _lib.i2d_X509_NAME(self._name, result_buffer) - if encode_result < 0: - # TODO: This is untested. - _raise_current_error() - - string_result = _ffi.buffer(result_buffer[0], encode_result)[:] - _lib.OPENSSL_free(result_buffer[0]) - return string_result - - - def get_components(self): - """ - Returns the split-up components of this name. - - :return: List of tuples (name, value). - """ - result = [] - for i in range(_lib.X509_NAME_entry_count(self._name)): - ent = _lib.X509_NAME_get_entry(self._name, i) - - fname = _lib.X509_NAME_ENTRY_get_object(ent) - fval = _lib.X509_NAME_ENTRY_get_data(ent) - - nid = _lib.OBJ_obj2nid(fname) - name = _lib.OBJ_nid2sn(nid) - - result.append(( - _ffi.string(name), - _ffi.string( - _lib.ASN1_STRING_data(fval), - _lib.ASN1_STRING_length(fval)))) - - return result -X509NameType = X509Name - - -class X509Extension(object): - def __init__(self, type_name, critical, value, subject=None, issuer=None): - """ - :param typename: The name of the extension to create. - :type typename: :py:data:`str` - - :param critical: A flag indicating whether this is a critical extension. - - :param value: The value of the extension. - :type value: :py:data:`str` - - :param subject: Optional X509 cert to use as subject. - :type subject: :py:class:`X509` - - :param issuer: Optional X509 cert to use as issuer. - :type issuer: :py:class:`X509` - - :return: The X509Extension object - """ - ctx = _ffi.new("X509V3_CTX*") - - # A context is necessary for any extension which uses the r2i conversion - # method. That is, X509V3_EXT_nconf may segfault if passed a NULL ctx. - # Start off by initializing most of the fields to NULL. - _lib.X509V3_set_ctx(ctx, _ffi.NULL, _ffi.NULL, _ffi.NULL, _ffi.NULL, 0) - - # We have no configuration database - but perhaps we should (some - # extensions may require it). - _lib.X509V3_set_ctx_nodb(ctx) - - # Initialize the subject and issuer, if appropriate. ctx is a local, - # and as far as I can tell none of the X509V3_* APIs invoked here steal - # any references, so no need to mess with reference counts or duplicates. - if issuer is not None: - if not isinstance(issuer, X509): - raise TypeError("issuer must be an X509 instance") - ctx.issuer_cert = issuer._x509 - if subject is not None: - if not isinstance(subject, X509): - raise TypeError("subject must be an X509 instance") - ctx.subject_cert = subject._x509 - - if critical: - # There are other OpenSSL APIs which would let us pass in critical - # separately, but they're harder to use, and since value is already - # a pile of crappy junk smuggling a ton of utterly important - # structured data, what's the point of trying to avoid nasty stuff - # with strings? (However, X509V3_EXT_i2d in particular seems like it - # would be a better API to invoke. I do not know where to get the - # ext_struc it desires for its last parameter, though.) - value = b"critical," + value - - extension = _lib.X509V3_EXT_nconf(_ffi.NULL, ctx, type_name, value) - if extension == _ffi.NULL: - _raise_current_error() - self._extension = _ffi.gc(extension, _lib.X509_EXTENSION_free) - - - @property - def _nid(self): - return _lib.OBJ_obj2nid(self._extension.object) - - _prefixes = { - _lib.GEN_EMAIL: "email", - _lib.GEN_DNS: "DNS", - _lib.GEN_URI: "URI", - } - - def _subjectAltNameString(self): - method = _lib.X509V3_EXT_get(self._extension) - if method == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - payload = self._extension.value.data - length = self._extension.value.length - - payloadptr = _ffi.new("unsigned char**") - payloadptr[0] = payload - - if method.it != _ffi.NULL: - ptr = _lib.ASN1_ITEM_ptr(method.it) - data = _lib.ASN1_item_d2i(_ffi.NULL, payloadptr, length, ptr) - names = _ffi.cast("GENERAL_NAMES*", data) - else: - names = _ffi.cast( - "GENERAL_NAMES*", - method.d2i(_ffi.NULL, payloadptr, length)) - - parts = [] - for i in range(_lib.sk_GENERAL_NAME_num(names)): - name = _lib.sk_GENERAL_NAME_value(names, i) - try: - label = self._prefixes[name.type] - except KeyError: - bio = _new_mem_buf() - _lib.GENERAL_NAME_print(bio, name) - parts.append(_native(_bio_to_string(bio))) - else: - value = _native( - _ffi.buffer(name.d.ia5.data, name.d.ia5.length)[:]) - parts.append(label + ":" + value) - return ", ".join(parts) - - - def __str__(self): - """ - :return: a nice text representation of the extension - """ - if _lib.NID_subject_alt_name == self._nid: - return self._subjectAltNameString() - - bio = _new_mem_buf() - print_result = _lib.X509V3_EXT_print(bio, self._extension, 0, 0) - if not print_result: - # TODO: This is untested. - _raise_current_error() - - return _native(_bio_to_string(bio)) - - - def get_critical(self): - """ - Returns the critical field of the X509Extension - - :return: The critical field. - """ - return _lib.X509_EXTENSION_get_critical(self._extension) - - - def get_short_name(self): - """ - Returns the short version of the type name of the X509Extension - - :return: The short type name. - """ - obj = _lib.X509_EXTENSION_get_object(self._extension) - nid = _lib.OBJ_obj2nid(obj) - return _ffi.string(_lib.OBJ_nid2sn(nid)) - - - def get_data(self): - """ - Returns the data of the X509Extension - - :return: A :py:data:`str` giving the X509Extension's ASN.1 encoded data. - """ - octet_result = _lib.X509_EXTENSION_get_data(self._extension) - string_result = _ffi.cast('ASN1_STRING*', octet_result) - char_result = _lib.ASN1_STRING_data(string_result) - result_length = _lib.ASN1_STRING_length(string_result) - return _ffi.buffer(char_result, result_length)[:] - -X509ExtensionType = X509Extension - - -class X509Req(object): - def __init__(self): - req = _lib.X509_REQ_new() - self._req = _ffi.gc(req, _lib.X509_REQ_free) - - - def set_pubkey(self, pkey): - """ - Set the public key of the certificate request - - :param pkey: The public key to use - :return: None - """ - set_result = _lib.X509_REQ_set_pubkey(self._req, pkey._pkey) - if not set_result: - # TODO: This is untested. - _raise_current_error() - - - def get_pubkey(self): - """ - Get the public key from the certificate request - - :return: The public key - """ - pkey = PKey.__new__(PKey) - pkey._pkey = _lib.X509_REQ_get_pubkey(self._req) - if pkey._pkey == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - pkey._pkey = _ffi.gc(pkey._pkey, _lib.EVP_PKEY_free) - pkey._only_public = True - return pkey - - - def set_version(self, version): - """ - Set the version subfield (RFC 2459, section 4.1.2.1) of the certificate - request. - - :param version: The version number - :return: None - """ - set_result = _lib.X509_REQ_set_version(self._req, version) - if not set_result: - _raise_current_error() - - - def get_version(self): - """ - Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate - request. - - :return: an integer giving the value of the version subfield - """ - return _lib.X509_REQ_get_version(self._req) - - - def get_subject(self): - """ - Create an X509Name object for the subject of the certificate request - - :return: An X509Name object - """ - name = X509Name.__new__(X509Name) - name._name = _lib.X509_REQ_get_subject_name(self._req) - if name._name == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - # The name is owned by the X509Req structure. As long as the X509Name - # Python object is alive, keep the X509Req Python object alive. - name._owner = self - - return name - - - def add_extensions(self, extensions): - """ - Add extensions to the request. - - :param extensions: a sequence of X509Extension objects - :return: None - """ - stack = _lib.sk_X509_EXTENSION_new_null() - if stack == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - stack = _ffi.gc(stack, _lib.sk_X509_EXTENSION_free) - - for ext in extensions: - if not isinstance(ext, X509Extension): - raise ValueError("One of the elements is not an X509Extension") - - # TODO push can fail (here and elsewhere) - _lib.sk_X509_EXTENSION_push(stack, ext._extension) - - add_result = _lib.X509_REQ_add_extensions(self._req, stack) - if not add_result: - # TODO: This is untested. - _raise_current_error() - - - def sign(self, pkey, digest): - """ - Sign the certificate request using the supplied key and digest - - :param pkey: The key to sign with - :param digest: The message digest to use - :return: None - """ - if pkey._only_public: - raise ValueError("Key has only public part") - - if not pkey._initialized: - raise ValueError("Key is uninitialized") - - digest_obj = _lib.EVP_get_digestbyname(_byte_string(digest)) - if digest_obj == _ffi.NULL: - raise ValueError("No such digest method") - - sign_result = _lib.X509_REQ_sign(self._req, pkey._pkey, digest_obj) - if not sign_result: - # TODO: This is untested. - _raise_current_error() - - - def verify(self, pkey): - """ - Verifies a certificate request using the supplied public key - - :param key: a public key - :return: True if the signature is correct. - - :raise OpenSSL.crypto.Error: If the signature is invalid or there is a - problem verifying the signature. - """ - if not isinstance(pkey, PKey): - raise TypeError("pkey must be a PKey instance") - - result = _lib.X509_REQ_verify(self._req, pkey._pkey) - if result <= 0: - _raise_current_error() - - return result - - -X509ReqType = X509Req - - - -class X509(object): - def __init__(self): - # TODO Allocation failure? And why not __new__ instead of __init__? - x509 = _lib.X509_new() - self._x509 = _ffi.gc(x509, _lib.X509_free) - - - def set_version(self, version): - """ - Set version number of the certificate - - :param version: The version number - :type version: :py:class:`int` - - :return: None - """ - if not isinstance(version, int): - raise TypeError("version must be an integer") - - _lib.X509_set_version(self._x509, version) - - - def get_version(self): - """ - Return version number of the certificate - - :return: Version number as a Python integer - """ - return _lib.X509_get_version(self._x509) - - - def get_pubkey(self): - """ - Get the public key of the certificate - - :return: The public key - """ - pkey = PKey.__new__(PKey) - pkey._pkey = _lib.X509_get_pubkey(self._x509) - if pkey._pkey == _ffi.NULL: - _raise_current_error() - pkey._pkey = _ffi.gc(pkey._pkey, _lib.EVP_PKEY_free) - pkey._only_public = True - return pkey - - - def set_pubkey(self, pkey): - """ - Set the public key of the certificate - - :param pkey: The public key - - :return: None - """ - if not isinstance(pkey, PKey): - raise TypeError("pkey must be a PKey instance") - - set_result = _lib.X509_set_pubkey(self._x509, pkey._pkey) - if not set_result: - _raise_current_error() - - - def sign(self, pkey, digest): - """ - Sign the certificate using the supplied key and digest - - :param pkey: The key to sign with - :param digest: The message digest to use - :return: None - """ - if not isinstance(pkey, PKey): - raise TypeError("pkey must be a PKey instance") - - if pkey._only_public: - raise ValueError("Key only has public part") - - if not pkey._initialized: - raise ValueError("Key is uninitialized") - - evp_md = _lib.EVP_get_digestbyname(_byte_string(digest)) - if evp_md == _ffi.NULL: - raise ValueError("No such digest method") - - sign_result = _lib.X509_sign(self._x509, pkey._pkey, evp_md) - if not sign_result: - _raise_current_error() - - - def get_signature_algorithm(self): - """ - Retrieve the signature algorithm used in the certificate - - :return: A byte string giving the name of the signature algorithm used in - the certificate. - :raise ValueError: If the signature algorithm is undefined. - """ - alg = self._x509.cert_info.signature.algorithm - nid = _lib.OBJ_obj2nid(alg) - if nid == _lib.NID_undef: - raise ValueError("Undefined signature algorithm") - return _ffi.string(_lib.OBJ_nid2ln(nid)) - - - def digest(self, digest_name): - """ - Return the digest of the X509 object. - - :param digest_name: The name of the digest algorithm to use. - :type digest_name: :py:class:`bytes` - - :return: The digest of the object - """ - digest = _lib.EVP_get_digestbyname(_byte_string(digest_name)) - if digest == _ffi.NULL: - raise ValueError("No such digest method") - - result_buffer = _ffi.new("char[]", _lib.EVP_MAX_MD_SIZE) - result_length = _ffi.new("unsigned int[]", 1) - result_length[0] = len(result_buffer) - - digest_result = _lib.X509_digest( - self._x509, digest, result_buffer, result_length) - - if not digest_result: - # TODO: This is untested. - _raise_current_error() - - return b":".join([ - b16encode(ch).upper() for ch - in _ffi.buffer(result_buffer, result_length[0])]) - - - def subject_name_hash(self): - """ - Return the hash of the X509 subject. - - :return: The hash of the subject. - """ - return _lib.X509_subject_name_hash(self._x509) - - - def set_serial_number(self, serial): - """ - Set serial number of the certificate - - :param serial: The serial number - :type serial: :py:class:`int` - - :return: None - """ - if not isinstance(serial, _integer_types): - raise TypeError("serial must be an integer") - - hex_serial = hex(serial)[2:] - if not isinstance(hex_serial, bytes): - hex_serial = hex_serial.encode('ascii') - - bignum_serial = _ffi.new("BIGNUM**") - - # BN_hex2bn stores the result in &bignum. Unless it doesn't feel like - # it. If bignum is still NULL after this call, then the return value is - # actually the result. I hope. -exarkun - small_serial = _lib.BN_hex2bn(bignum_serial, hex_serial) - - if bignum_serial[0] == _ffi.NULL: - set_result = _lib.ASN1_INTEGER_set( - _lib.X509_get_serialNumber(self._x509), small_serial) - if set_result: - # TODO Not tested - _raise_current_error() - else: - asn1_serial = _lib.BN_to_ASN1_INTEGER(bignum_serial[0], _ffi.NULL) - _lib.BN_free(bignum_serial[0]) - if asn1_serial == _ffi.NULL: - # TODO Not tested - _raise_current_error() - asn1_serial = _ffi.gc(asn1_serial, _lib.ASN1_INTEGER_free) - set_result = _lib.X509_set_serialNumber(self._x509, asn1_serial) - if not set_result: - # TODO Not tested - _raise_current_error() - - - def get_serial_number(self): - """ - Return serial number of the certificate - - :return: Serial number as a Python integer - """ - asn1_serial = _lib.X509_get_serialNumber(self._x509) - bignum_serial = _lib.ASN1_INTEGER_to_BN(asn1_serial, _ffi.NULL) - try: - hex_serial = _lib.BN_bn2hex(bignum_serial) - try: - hexstring_serial = _ffi.string(hex_serial) - serial = int(hexstring_serial, 16) - return serial - finally: - _lib.OPENSSL_free(hex_serial) - finally: - _lib.BN_free(bignum_serial) - - - def gmtime_adj_notAfter(self, amount): - """ - Adjust the time stamp for when the certificate stops being valid - - :param amount: The number of seconds by which to adjust the ending - validity time. - :type amount: :py:class:`int` - - :return: None - """ - if not isinstance(amount, int): - raise TypeError("amount must be an integer") - - notAfter = _lib.X509_get_notAfter(self._x509) - _lib.X509_gmtime_adj(notAfter, amount) - - - def gmtime_adj_notBefore(self, amount): - """ - Change the timestamp for when the certificate starts being valid to the current - time plus an offset. - - :param amount: The number of seconds by which to adjust the starting validity - time. - :return: None - """ - if not isinstance(amount, int): - raise TypeError("amount must be an integer") - - notBefore = _lib.X509_get_notBefore(self._x509) - _lib.X509_gmtime_adj(notBefore, amount) - - - def has_expired(self): - """ - Check whether the certificate has expired. - - :return: True if the certificate has expired, false otherwise - """ - now = int(time()) - notAfter = _lib.X509_get_notAfter(self._x509) - return _lib.ASN1_UTCTIME_cmp_time_t( - _ffi.cast('ASN1_UTCTIME*', notAfter), now) < 0 - - - def _get_boundary_time(self, which): - return _get_asn1_time(which(self._x509)) - - - def get_notBefore(self): - """ - Retrieve the time stamp for when the certificate starts being valid - - :return: A string giving the timestamp, in the format:: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - or None if there is no value set. - """ - return self._get_boundary_time(_lib.X509_get_notBefore) - - - def _set_boundary_time(self, which, when): - return _set_asn1_time(which(self._x509), when) - - - def set_notBefore(self, when): - """ - Set the time stamp for when the certificate starts being valid - - :param when: A string giving the timestamp, in the format: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - :type when: :py:class:`bytes` - - :return: None - """ - return self._set_boundary_time(_lib.X509_get_notBefore, when) - - - def get_notAfter(self): - """ - Retrieve the time stamp for when the certificate stops being valid - - :return: A string giving the timestamp, in the format:: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - or None if there is no value set. - """ - return self._get_boundary_time(_lib.X509_get_notAfter) - - - def set_notAfter(self, when): - """ - Set the time stamp for when the certificate stops being valid - - :param when: A string giving the timestamp, in the format: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - :type when: :py:class:`bytes` - - :return: None - """ - return self._set_boundary_time(_lib.X509_get_notAfter, when) - - - def _get_name(self, which): - name = X509Name.__new__(X509Name) - name._name = which(self._x509) - if name._name == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - # The name is owned by the X509 structure. As long as the X509Name - # Python object is alive, keep the X509 Python object alive. - name._owner = self - - return name - - - def _set_name(self, which, name): - if not isinstance(name, X509Name): - raise TypeError("name must be an X509Name") - set_result = which(self._x509, name._name) - if not set_result: - # TODO: This is untested. - _raise_current_error() - - - def get_issuer(self): - """ - Create an X509Name object for the issuer of the certificate - - :return: An X509Name object - """ - return self._get_name(_lib.X509_get_issuer_name) - - - def set_issuer(self, issuer): - """ - Set the issuer of the certificate - - :param issuer: The issuer name - :type issuer: :py:class:`X509Name` - - :return: None - """ - return self._set_name(_lib.X509_set_issuer_name, issuer) - - - def get_subject(self): - """ - Create an X509Name object for the subject of the certificate - - :return: An X509Name object - """ - return self._get_name(_lib.X509_get_subject_name) - - - def set_subject(self, subject): - """ - Set the subject of the certificate - - :param subject: The subject name - :type subject: :py:class:`X509Name` - :return: None - """ - return self._set_name(_lib.X509_set_subject_name, subject) - - - def get_extension_count(self): - """ - Get the number of extensions on the certificate. - - :return: The number of extensions as an integer. - """ - return _lib.X509_get_ext_count(self._x509) - - - def add_extensions(self, extensions): - """ - Add extensions to the certificate. - - :param extensions: a sequence of X509Extension objects - :return: None - """ - for ext in extensions: - if not isinstance(ext, X509Extension): - raise ValueError("One of the elements is not an X509Extension") - - add_result = _lib.X509_add_ext(self._x509, ext._extension, -1) - if not add_result: - _raise_current_error() - - - def get_extension(self, index): - """ - Get a specific extension of the certificate by index. - - :param index: The index of the extension to retrieve. - :return: The X509Extension object at the specified index. - """ - ext = X509Extension.__new__(X509Extension) - ext._extension = _lib.X509_get_ext(self._x509, index) - if ext._extension == _ffi.NULL: - raise IndexError("extension index out of bounds") - - extension = _lib.X509_EXTENSION_dup(ext._extension) - ext._extension = _ffi.gc(extension, _lib.X509_EXTENSION_free) - return ext - -X509Type = X509 - - - -class X509Store(object): - def __init__(self): - store = _lib.X509_STORE_new() - self._store = _ffi.gc(store, _lib.X509_STORE_free) - - - def add_cert(self, cert): - if not isinstance(cert, X509): - raise TypeError() - - result = _lib.X509_STORE_add_cert(self._store, cert._x509) - if not result: - _raise_current_error() - - -X509StoreType = X509Store - - - -def load_certificate(type, buffer): - """ - Load a certificate from a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1) - - :param buffer: The buffer the certificate is stored in - :type buffer: :py:class:`bytes` - - :return: The X509 object - """ - if isinstance(buffer, _text_type): - buffer = buffer.encode("ascii") - - bio = _new_mem_buf(buffer) - - if type == FILETYPE_PEM: - x509 = _lib.PEM_read_bio_X509(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL) - elif type == FILETYPE_ASN1: - x509 = _lib.d2i_X509_bio(bio, _ffi.NULL); - else: - raise ValueError( - "type argument must be FILETYPE_PEM or FILETYPE_ASN1") - - if x509 == _ffi.NULL: - _raise_current_error() - - cert = X509.__new__(X509) - cert._x509 = _ffi.gc(x509, _lib.X509_free) - return cert - - -def dump_certificate(type, cert): - """ - Dump a certificate to a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or - FILETYPE_TEXT) - :param cert: The certificate to dump - :return: The buffer with the dumped certificate in - """ - bio = _new_mem_buf() - - if type == FILETYPE_PEM: - result_code = _lib.PEM_write_bio_X509(bio, cert._x509) - elif type == FILETYPE_ASN1: - result_code = _lib.i2d_X509_bio(bio, cert._x509) - elif type == FILETYPE_TEXT: - result_code = _lib.X509_print_ex(bio, cert._x509, 0, 0) - else: - raise ValueError( - "type argument must be FILETYPE_PEM, FILETYPE_ASN1, or " - "FILETYPE_TEXT") - - return _bio_to_string(bio) - - - -def dump_privatekey(type, pkey, cipher=None, passphrase=None): - """ - Dump a private key to a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or - FILETYPE_TEXT) - :param pkey: The PKey to dump - :param cipher: (optional) if encrypted PEM format, the cipher to - use - :param passphrase: (optional) if encrypted PEM format, this can be either - the passphrase to use, or a callback for providing the - passphrase. - :return: The buffer with the dumped key in - :rtype: :py:data:`str` - """ - bio = _new_mem_buf() - - if cipher is not None: - if passphrase is None: - raise TypeError( - "if a value is given for cipher " - "one must also be given for passphrase") - cipher_obj = _lib.EVP_get_cipherbyname(_byte_string(cipher)) - if cipher_obj == _ffi.NULL: - raise ValueError("Invalid cipher name") - else: - cipher_obj = _ffi.NULL - - helper = _PassphraseHelper(type, passphrase) - if type == FILETYPE_PEM: - result_code = _lib.PEM_write_bio_PrivateKey( - bio, pkey._pkey, cipher_obj, _ffi.NULL, 0, - helper.callback, helper.callback_args) - helper.raise_if_problem() - elif type == FILETYPE_ASN1: - result_code = _lib.i2d_PrivateKey_bio(bio, pkey._pkey) - elif type == FILETYPE_TEXT: - rsa = _lib.EVP_PKEY_get1_RSA(pkey._pkey) - result_code = _lib.RSA_print(bio, rsa, 0) - # TODO RSA_free(rsa)? - else: - raise ValueError( - "type argument must be FILETYPE_PEM, FILETYPE_ASN1, or " - "FILETYPE_TEXT") - - if result_code == 0: - _raise_current_error() - - return _bio_to_string(bio) - - - -def _X509_REVOKED_dup(original): - copy = _lib.X509_REVOKED_new() - if copy == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - if original.serialNumber != _ffi.NULL: - copy.serialNumber = _lib.ASN1_INTEGER_dup(original.serialNumber) - - if original.revocationDate != _ffi.NULL: - copy.revocationDate = _lib.M_ASN1_TIME_dup(original.revocationDate) - - if original.extensions != _ffi.NULL: - extension_stack = _lib.sk_X509_EXTENSION_new_null() - for i in range(_lib.sk_X509_EXTENSION_num(original.extensions)): - original_ext = _lib.sk_X509_EXTENSION_value(original.extensions, i) - copy_ext = _lib.X509_EXTENSION_dup(original_ext) - _lib.sk_X509_EXTENSION_push(extension_stack, copy_ext) - copy.extensions = extension_stack - - copy.sequence = original.sequence - return copy - - - -class Revoked(object): - # http://www.openssl.org/docs/apps/x509v3_config.html#CRL_distribution_points_ - # which differs from crl_reasons of crypto/x509v3/v3_enum.c that matches - # OCSP_crl_reason_str. We use the latter, just like the command line - # program. - _crl_reasons = [ - b"unspecified", - b"keyCompromise", - b"CACompromise", - b"affiliationChanged", - b"superseded", - b"cessationOfOperation", - b"certificateHold", - # b"removeFromCRL", - ] - - def __init__(self): - revoked = _lib.X509_REVOKED_new() - self._revoked = _ffi.gc(revoked, _lib.X509_REVOKED_free) - - - def set_serial(self, hex_str): - """ - Set the serial number of a revoked Revoked structure - - :param hex_str: The new serial number. - :type hex_str: :py:data:`str` - :return: None - """ - bignum_serial = _ffi.gc(_lib.BN_new(), _lib.BN_free) - bignum_ptr = _ffi.new("BIGNUM**") - bignum_ptr[0] = bignum_serial - bn_result = _lib.BN_hex2bn(bignum_ptr, hex_str) - if not bn_result: - raise ValueError("bad hex string") - - asn1_serial = _ffi.gc( - _lib.BN_to_ASN1_INTEGER(bignum_serial, _ffi.NULL), - _lib.ASN1_INTEGER_free) - _lib.X509_REVOKED_set_serialNumber(self._revoked, asn1_serial) - - - def get_serial(self): - """ - Return the serial number of a Revoked structure - - :return: The serial number as a string - """ - bio = _new_mem_buf() - - result = _lib.i2a_ASN1_INTEGER(bio, self._revoked.serialNumber) - if result < 0: - # TODO: This is untested. - _raise_current_error() - - return _bio_to_string(bio) - - - def _delete_reason(self): - stack = self._revoked.extensions - for i in range(_lib.sk_X509_EXTENSION_num(stack)): - ext = _lib.sk_X509_EXTENSION_value(stack, i) - if _lib.OBJ_obj2nid(ext.object) == _lib.NID_crl_reason: - _lib.X509_EXTENSION_free(ext) - _lib.sk_X509_EXTENSION_delete(stack, i) - break - - - def set_reason(self, reason): - """ - Set the reason of a Revoked object. - - If :py:data:`reason` is :py:data:`None`, delete the reason instead. - - :param reason: The reason string. - :type reason: :py:class:`str` or :py:class:`NoneType` - :return: None - """ - if reason is None: - self._delete_reason() - elif not isinstance(reason, bytes): - raise TypeError("reason must be None or a byte string") - else: - reason = reason.lower().replace(b' ', b'') - reason_code = [r.lower() for r in self._crl_reasons].index(reason) - - new_reason_ext = _lib.ASN1_ENUMERATED_new() - if new_reason_ext == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - new_reason_ext = _ffi.gc(new_reason_ext, _lib.ASN1_ENUMERATED_free) - - set_result = _lib.ASN1_ENUMERATED_set(new_reason_ext, reason_code) - if set_result == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - self._delete_reason() - add_result = _lib.X509_REVOKED_add1_ext_i2d( - self._revoked, _lib.NID_crl_reason, new_reason_ext, 0, 0) - - if not add_result: - # TODO: This is untested. - _raise_current_error() - - - def get_reason(self): - """ - Return the reason of a Revoked object. - - :return: The reason as a string - """ - extensions = self._revoked.extensions - for i in range(_lib.sk_X509_EXTENSION_num(extensions)): - ext = _lib.sk_X509_EXTENSION_value(extensions, i) - if _lib.OBJ_obj2nid(ext.object) == _lib.NID_crl_reason: - bio = _new_mem_buf() - - print_result = _lib.X509V3_EXT_print(bio, ext, 0, 0) - if not print_result: - print_result = _lib.M_ASN1_OCTET_STRING_print(bio, ext.value) - if print_result == 0: - # TODO: This is untested. - _raise_current_error() - - return _bio_to_string(bio) - - - def all_reasons(self): - """ - Return a list of all the supported reason strings. - - :return: A list of reason strings. - """ - return self._crl_reasons[:] - - - def set_rev_date(self, when): - """ - Set the revocation timestamp - - :param when: A string giving the timestamp, in the format: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - - :return: None - """ - return _set_asn1_time(self._revoked.revocationDate, when) - - - def get_rev_date(self): - """ - Retrieve the revocation date - - :return: A string giving the timestamp, in the format: - - YYYYMMDDhhmmssZ - YYYYMMDDhhmmss+hhmm - YYYYMMDDhhmmss-hhmm - """ - return _get_asn1_time(self._revoked.revocationDate) - - - -class CRL(object): - def __init__(self): - """ - Create a new empty CRL object. - """ - crl = _lib.X509_CRL_new() - self._crl = _ffi.gc(crl, _lib.X509_CRL_free) - - - def get_revoked(self): - """ - Return revoked portion of the CRL structure (by value not reference). - - :return: A tuple of Revoked objects. - """ - results = [] - revoked_stack = self._crl.crl.revoked - for i in range(_lib.sk_X509_REVOKED_num(revoked_stack)): - revoked = _lib.sk_X509_REVOKED_value(revoked_stack, i) - revoked_copy = _X509_REVOKED_dup(revoked) - pyrev = Revoked.__new__(Revoked) - pyrev._revoked = _ffi.gc(revoked_copy, _lib.X509_REVOKED_free) - results.append(pyrev) - if results: - return tuple(results) - - - def add_revoked(self, revoked): - """ - Add a revoked (by value not reference) to the CRL structure - - :param revoked: The new revoked. - :type revoked: :class:`X509` - - :return: None - """ - copy = _X509_REVOKED_dup(revoked._revoked) - if copy == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - add_result = _lib.X509_CRL_add0_revoked(self._crl, copy) - if add_result == 0: - # TODO: This is untested. - _raise_current_error() - - - def export(self, cert, key, type=FILETYPE_PEM, days=100): - """ - export a CRL as a string - - :param cert: Used to sign CRL. - :type cert: :class:`X509` - - :param key: Used to sign CRL. - :type key: :class:`PKey` - - :param type: The export format, either :py:data:`FILETYPE_PEM`, :py:data:`FILETYPE_ASN1`, or :py:data:`FILETYPE_TEXT`. - - :param days: The number of days until the next update of this CRL. - :type days: :py:data:`int` - - :return: :py:data:`str` - """ - if not isinstance(cert, X509): - raise TypeError("cert must be an X509 instance") - if not isinstance(key, PKey): - raise TypeError("key must be a PKey instance") - if not isinstance(type, int): - raise TypeError("type must be an integer") - - bio = _lib.BIO_new(_lib.BIO_s_mem()) - if bio == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - # A scratch time object to give different values to different CRL fields - sometime = _lib.ASN1_TIME_new() - if sometime == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - _lib.X509_gmtime_adj(sometime, 0) - _lib.X509_CRL_set_lastUpdate(self._crl, sometime) - - _lib.X509_gmtime_adj(sometime, days * 24 * 60 * 60) - _lib.X509_CRL_set_nextUpdate(self._crl, sometime) - - _lib.X509_CRL_set_issuer_name(self._crl, _lib.X509_get_subject_name(cert._x509)) - - sign_result = _lib.X509_CRL_sign(self._crl, key._pkey, _lib.EVP_md5()) - if not sign_result: - _raise_current_error() - - if type == FILETYPE_PEM: - ret = _lib.PEM_write_bio_X509_CRL(bio, self._crl) - elif type == FILETYPE_ASN1: - ret = _lib.i2d_X509_CRL_bio(bio, self._crl) - elif type == FILETYPE_TEXT: - ret = _lib.X509_CRL_print(bio, self._crl) - else: - raise ValueError( - "type argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT") - - if not ret: - # TODO: This is untested. - _raise_current_error() - - return _bio_to_string(bio) -CRLType = CRL - - - -class PKCS7(object): - def type_is_signed(self): - """ - Check if this NID_pkcs7_signed object - - :return: True if the PKCS7 is of type signed - """ - if _lib.PKCS7_type_is_signed(self._pkcs7): - return True - return False - - - def type_is_enveloped(self): - """ - Check if this NID_pkcs7_enveloped object - - :returns: True if the PKCS7 is of type enveloped - """ - if _lib.PKCS7_type_is_enveloped(self._pkcs7): - return True - return False - - - def type_is_signedAndEnveloped(self): - """ - Check if this NID_pkcs7_signedAndEnveloped object - - :returns: True if the PKCS7 is of type signedAndEnveloped - """ - if _lib.PKCS7_type_is_signedAndEnveloped(self._pkcs7): - return True - return False - - - def type_is_data(self): - """ - Check if this NID_pkcs7_data object - - :return: True if the PKCS7 is of type data - """ - if _lib.PKCS7_type_is_data(self._pkcs7): - return True - return False - - - def get_type_name(self): - """ - Returns the type name of the PKCS7 structure - - :return: A string with the typename - """ - nid = _lib.OBJ_obj2nid(self._pkcs7.type) - string_type = _lib.OBJ_nid2sn(nid) - return _ffi.string(string_type) - -PKCS7Type = PKCS7 - - - -class PKCS12(object): - def __init__(self): - self._pkey = None - self._cert = None - self._cacerts = None - self._friendlyname = None - - - def get_certificate(self): - """ - Return certificate portion of the PKCS12 structure - - :return: X509 object containing the certificate - """ - return self._cert - - - def set_certificate(self, cert): - """ - Replace the certificate portion of the PKCS12 structure - - :param cert: The new certificate. - :type cert: :py:class:`X509` or :py:data:`None` - :return: None - """ - if not isinstance(cert, X509): - raise TypeError("cert must be an X509 instance") - self._cert = cert - - - def get_privatekey(self): - """ - Return private key portion of the PKCS12 structure - - :returns: PKey object containing the private key - """ - return self._pkey - - - def set_privatekey(self, pkey): - """ - Replace or set the certificate portion of the PKCS12 structure - - :param pkey: The new private key. - :type pkey: :py:class:`PKey` - :return: None - """ - if not isinstance(pkey, PKey): - raise TypeError("pkey must be a PKey instance") - self._pkey = pkey - - - def get_ca_certificates(self): - """ - Return CA certificates within of the PKCS12 object - - :return: A newly created tuple containing the CA certificates in the chain, - if any are present, or None if no CA certificates are present. - """ - if self._cacerts is not None: - return tuple(self._cacerts) - - - def set_ca_certificates(self, cacerts): - """ - Replace or set the CA certificates withing the PKCS12 object. - - :param cacerts: The new CA certificates. - :type cacerts: :py:data:`None` or an iterable of :py:class:`X509` - :return: None - """ - if cacerts is None: - self._cacerts = None - else: - cacerts = list(cacerts) - for cert in cacerts: - if not isinstance(cert, X509): - raise TypeError("iterable must only contain X509 instances") - self._cacerts = cacerts - - - def set_friendlyname(self, name): - """ - Replace or set the certificate portion of the PKCS12 structure - - :param name: The new friendly name. - :type name: :py:class:`bytes` - :return: None - """ - if name is None: - self._friendlyname = None - elif not isinstance(name, bytes): - raise TypeError("name must be a byte string or None (not %r)" % (name,)) - self._friendlyname = name - - - def get_friendlyname(self): - """ - Return friendly name portion of the PKCS12 structure - - :returns: String containing the friendlyname - """ - return self._friendlyname - - - def export(self, passphrase=None, iter=2048, maciter=1): - """ - Dump a PKCS12 object as a string. See also "man PKCS12_create". - - :param passphrase: used to encrypt the PKCS12 - :type passphrase: :py:data:`bytes` - - :param iter: How many times to repeat the encryption - :type iter: :py:data:`int` - - :param maciter: How many times to repeat the MAC - :type maciter: :py:data:`int` - - :return: The string containing the PKCS12 - """ - if self._cacerts is None: - cacerts = _ffi.NULL - else: - cacerts = _lib.sk_X509_new_null() - cacerts = _ffi.gc(cacerts, _lib.sk_X509_free) - for cert in self._cacerts: - _lib.sk_X509_push(cacerts, cert._x509) - - if passphrase is None: - passphrase = _ffi.NULL - - friendlyname = self._friendlyname - if friendlyname is None: - friendlyname = _ffi.NULL - - if self._pkey is None: - pkey = _ffi.NULL - else: - pkey = self._pkey._pkey - - if self._cert is None: - cert = _ffi.NULL - else: - cert = self._cert._x509 - - pkcs12 = _lib.PKCS12_create( - passphrase, friendlyname, pkey, cert, cacerts, - _lib.NID_pbe_WithSHA1And3_Key_TripleDES_CBC, - _lib.NID_pbe_WithSHA1And3_Key_TripleDES_CBC, - iter, maciter, 0) - if pkcs12 == _ffi.NULL: - _raise_current_error() - pkcs12 = _ffi.gc(pkcs12, _lib.PKCS12_free) - - bio = _new_mem_buf() - _lib.i2d_PKCS12_bio(bio, pkcs12) - return _bio_to_string(bio) - -PKCS12Type = PKCS12 - - - -class NetscapeSPKI(object): - def __init__(self): - spki = _lib.NETSCAPE_SPKI_new() - self._spki = _ffi.gc(spki, _lib.NETSCAPE_SPKI_free) - - - def sign(self, pkey, digest): - """ - Sign the certificate request using the supplied key and digest - - :param pkey: The key to sign with - :param digest: The message digest to use - :return: None - """ - if pkey._only_public: - raise ValueError("Key has only public part") - - if not pkey._initialized: - raise ValueError("Key is uninitialized") - - digest_obj = _lib.EVP_get_digestbyname(_byte_string(digest)) - if digest_obj == _ffi.NULL: - raise ValueError("No such digest method") - - sign_result = _lib.NETSCAPE_SPKI_sign(self._spki, pkey._pkey, digest_obj) - if not sign_result: - # TODO: This is untested. - _raise_current_error() - - - def verify(self, key): - """ - Verifies a certificate request using the supplied public key - - :param key: a public key - :return: True if the signature is correct. - :raise OpenSSL.crypto.Error: If the signature is invalid or there is a - problem verifying the signature. - """ - answer = _lib.NETSCAPE_SPKI_verify(self._spki, key._pkey) - if answer <= 0: - _raise_current_error() - return True - - - def b64_encode(self): - """ - Generate a base64 encoded string from an SPKI - - :return: The base64 encoded string - """ - encoded = _lib.NETSCAPE_SPKI_b64_encode(self._spki) - result = _ffi.string(encoded) - _lib.CRYPTO_free(encoded) - return result - - - def get_pubkey(self): - """ - Get the public key of the certificate - - :return: The public key - """ - pkey = PKey.__new__(PKey) - pkey._pkey = _lib.NETSCAPE_SPKI_get_pubkey(self._spki) - if pkey._pkey == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - pkey._pkey = _ffi.gc(pkey._pkey, _lib.EVP_PKEY_free) - pkey._only_public = True - return pkey - - - def set_pubkey(self, pkey): - """ - Set the public key of the certificate - - :param pkey: The public key - :return: None - """ - set_result = _lib.NETSCAPE_SPKI_set_pubkey(self._spki, pkey._pkey) - if not set_result: - # TODO: This is untested. - _raise_current_error() -NetscapeSPKIType = NetscapeSPKI - - -class _PassphraseHelper(object): - def __init__(self, type, passphrase, more_args=False, truncate=False): - if type != FILETYPE_PEM and passphrase is not None: - raise ValueError("only FILETYPE_PEM key format supports encryption") - self._passphrase = passphrase - self._more_args = more_args - self._truncate = truncate - self._problems = [] - - - @property - def callback(self): - if self._passphrase is None: - return _ffi.NULL - elif isinstance(self._passphrase, bytes): - return _ffi.NULL - elif callable(self._passphrase): - return _ffi.callback("pem_password_cb", self._read_passphrase) - else: - raise TypeError("Last argument must be string or callable") - - - @property - def callback_args(self): - if self._passphrase is None: - return _ffi.NULL - elif isinstance(self._passphrase, bytes): - return self._passphrase - elif callable(self._passphrase): - return _ffi.NULL - else: - raise TypeError("Last argument must be string or callable") - - - def raise_if_problem(self, exceptionType=Error): - try: - _exception_from_error_queue(exceptionType) - except exceptionType as e: - from_queue = e - if self._problems: - raise self._problems[0] - return from_queue - - - def _read_passphrase(self, buf, size, rwflag, userdata): - try: - if self._more_args: - result = self._passphrase(size, rwflag, userdata) - else: - result = self._passphrase(rwflag) - if not isinstance(result, bytes): - raise ValueError("String expected") - if len(result) > size: - if self._truncate: - result = result[:size] - else: - raise ValueError("passphrase returned by callback is too long") - for i in range(len(result)): - buf[i] = result[i:i + 1] - return len(result) - except Exception as e: - self._problems.append(e) - return 0 - - - -def load_privatekey(type, buffer, passphrase=None): - """ - Load a private key from a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1) - :param buffer: The buffer the key is stored in - :param passphrase: (optional) if encrypted PEM format, this can be - either the passphrase to use, or a callback for - providing the passphrase. - - :return: The PKey object - """ - if isinstance(buffer, _text_type): - buffer = buffer.encode("ascii") - - bio = _new_mem_buf(buffer) - - helper = _PassphraseHelper(type, passphrase) - if type == FILETYPE_PEM: - evp_pkey = _lib.PEM_read_bio_PrivateKey( - bio, _ffi.NULL, helper.callback, helper.callback_args) - helper.raise_if_problem() - elif type == FILETYPE_ASN1: - evp_pkey = _lib.d2i_PrivateKey_bio(bio, _ffi.NULL) - else: - raise ValueError("type argument must be FILETYPE_PEM or FILETYPE_ASN1") - - if evp_pkey == _ffi.NULL: - _raise_current_error() - - pkey = PKey.__new__(PKey) - pkey._pkey = _ffi.gc(evp_pkey, _lib.EVP_PKEY_free) - return pkey - - - -def dump_certificate_request(type, req): - """ - Dump a certificate request to a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1) - :param req: The certificate request to dump - :return: The buffer with the dumped certificate request in - """ - bio = _new_mem_buf() - - if type == FILETYPE_PEM: - result_code = _lib.PEM_write_bio_X509_REQ(bio, req._req) - elif type == FILETYPE_ASN1: - result_code = _lib.i2d_X509_REQ_bio(bio, req._req) - elif type == FILETYPE_TEXT: - result_code = _lib.X509_REQ_print_ex(bio, req._req, 0, 0) - else: - raise ValueError("type argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT") - - if result_code == 0: - # TODO: This is untested. - _raise_current_error() - - return _bio_to_string(bio) - - - -def load_certificate_request(type, buffer): - """ - Load a certificate request from a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1) - :param buffer: The buffer the certificate request is stored in - :return: The X509Req object - """ - if isinstance(buffer, _text_type): - buffer = buffer.encode("ascii") - - bio = _new_mem_buf(buffer) - - if type == FILETYPE_PEM: - req = _lib.PEM_read_bio_X509_REQ(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL) - elif type == FILETYPE_ASN1: - req = _lib.d2i_X509_REQ_bio(bio, _ffi.NULL) - else: - raise ValueError("type argument must be FILETYPE_PEM or FILETYPE_ASN1") - - if req == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - - x509req = X509Req.__new__(X509Req) - x509req._req = _ffi.gc(req, _lib.X509_REQ_free) - return x509req - - - -def sign(pkey, data, digest): - """ - Sign data with a digest - - :param pkey: Pkey to sign with - :param data: data to be signed - :param digest: message digest to use - :return: signature - """ - digest_obj = _lib.EVP_get_digestbyname(_byte_string(digest)) - if digest_obj == _ffi.NULL: - raise ValueError("No such digest method") - - md_ctx = _ffi.new("EVP_MD_CTX*") - md_ctx = _ffi.gc(md_ctx, _lib.EVP_MD_CTX_cleanup) - - _lib.EVP_SignInit(md_ctx, digest_obj) - _lib.EVP_SignUpdate(md_ctx, data, len(data)) - - signature_buffer = _ffi.new("unsigned char[]", 512) - signature_length = _ffi.new("unsigned int*") - signature_length[0] = len(signature_buffer) - final_result = _lib.EVP_SignFinal( - md_ctx, signature_buffer, signature_length, pkey._pkey) - - if final_result != 1: - # TODO: This is untested. - _raise_current_error() - - return _ffi.buffer(signature_buffer, signature_length[0])[:] - - - -def verify(cert, signature, data, digest): - """ - Verify a signature - - :param cert: signing certificate (X509 object) - :param signature: signature returned by sign function - :param data: data to be verified - :param digest: message digest to use - :return: None if the signature is correct, raise exception otherwise - """ - digest_obj = _lib.EVP_get_digestbyname(_byte_string(digest)) - if digest_obj == _ffi.NULL: - raise ValueError("No such digest method") - - pkey = _lib.X509_get_pubkey(cert._x509) - if pkey == _ffi.NULL: - # TODO: This is untested. - _raise_current_error() - pkey = _ffi.gc(pkey, _lib.EVP_PKEY_free) - - md_ctx = _ffi.new("EVP_MD_CTX*") - md_ctx = _ffi.gc(md_ctx, _lib.EVP_MD_CTX_cleanup) - - _lib.EVP_VerifyInit(md_ctx, digest_obj) - _lib.EVP_VerifyUpdate(md_ctx, data, len(data)) - verify_result = _lib.EVP_VerifyFinal(md_ctx, signature, len(signature), pkey) - - if verify_result != 1: - _raise_current_error() - - - -def load_crl(type, buffer): - """ - Load a certificate revocation list from a buffer - - :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1) - :param buffer: The buffer the CRL is stored in - - :return: The PKey object - """ - if isinstance(buffer, _text_type): - buffer = buffer.encode("ascii") - - bio = _new_mem_buf(buffer) - - if type == FILETYPE_PEM: - crl = _lib.PEM_read_bio_X509_CRL(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL) - elif type == FILETYPE_ASN1: - crl = _lib.d2i_X509_CRL_bio(bio, _ffi.NULL) - else: - raise ValueError("type argument must be FILETYPE_PEM or FILETYPE_ASN1") - - if crl == _ffi.NULL: - _raise_current_error() - - result = CRL.__new__(CRL) - result._crl = crl - return result - - - -def load_pkcs7_data(type, buffer): - """ - Load pkcs7 data from a buffer - - :param type: The file type (one of FILETYPE_PEM or FILETYPE_ASN1) - :param buffer: The buffer with the pkcs7 data. - :return: The PKCS7 object - """ - if isinstance(buffer, _text_type): - buffer = buffer.encode("ascii") - - bio = _new_mem_buf(buffer) - - if type == FILETYPE_PEM: - pkcs7 = _lib.PEM_read_bio_PKCS7(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL) - elif type == FILETYPE_ASN1: - pass - else: - # TODO: This is untested. - _raise_current_error() - raise ValueError("type argument must be FILETYPE_PEM or FILETYPE_ASN1") - - if pkcs7 == _ffi.NULL: - _raise_current_error() - - pypkcs7 = PKCS7.__new__(PKCS7) - pypkcs7._pkcs7 = _ffi.gc(pkcs7, _lib.PKCS7_free) - return pypkcs7 - - - -def load_pkcs12(buffer, passphrase): - """ - Load a PKCS12 object from a buffer - - :param buffer: The buffer the certificate is stored in - :param passphrase: (Optional) The password to decrypt the PKCS12 lump - :returns: The PKCS12 object - """ - if isinstance(buffer, _text_type): - buffer = buffer.encode("ascii") - - bio = _new_mem_buf(buffer) - - p12 = _lib.d2i_PKCS12_bio(bio, _ffi.NULL) - if p12 == _ffi.NULL: - _raise_current_error() - p12 = _ffi.gc(p12, _lib.PKCS12_free) - - pkey = _ffi.new("EVP_PKEY**") - cert = _ffi.new("X509**") - cacerts = _ffi.new("Cryptography_STACK_OF_X509**") - - parse_result = _lib.PKCS12_parse(p12, passphrase, pkey, cert, cacerts) - if not parse_result: - _raise_current_error() - - cacerts = _ffi.gc(cacerts[0], _lib.sk_X509_free) - - # openssl 1.0.0 sometimes leaves an X509_check_private_key error in the - # queue for no particular reason. This error isn't interesting to anyone - # outside this function. It's not even interesting to us. Get rid of it. - try: - _raise_current_error() - except Error: - pass - - if pkey[0] == _ffi.NULL: - pykey = None - else: - pykey = PKey.__new__(PKey) - pykey._pkey = _ffi.gc(pkey[0], _lib.EVP_PKEY_free) - - if cert[0] == _ffi.NULL: - pycert = None - friendlyname = None - else: - pycert = X509.__new__(X509) - pycert._x509 = _ffi.gc(cert[0], _lib.X509_free) - - friendlyname_length = _ffi.new("int*") - friendlyname_buffer = _lib.X509_alias_get0(cert[0], friendlyname_length) - friendlyname = _ffi.buffer(friendlyname_buffer, friendlyname_length[0])[:] - if friendlyname_buffer == _ffi.NULL: - friendlyname = None - - pycacerts = [] - for i in range(_lib.sk_X509_num(cacerts)): - pycacert = X509.__new__(X509) - pycacert._x509 = _lib.sk_X509_value(cacerts, i) - pycacerts.append(pycacert) - if not pycacerts: - pycacerts = None - - pkcs12 = PKCS12.__new__(PKCS12) - pkcs12._pkey = pykey - pkcs12._cert = pycert - pkcs12._cacerts = pycacerts - pkcs12._friendlyname = friendlyname - return pkcs12 - - -def _initialize_openssl_threads(get_ident, Lock): - import _ssl - return - - locks = list(Lock() for n in range(_lib.CRYPTO_num_locks())) - - def locking_function(mode, index, filename, line): - if mode & _lib.CRYPTO_LOCK: - locks[index].acquire() - else: - locks[index].release() - - _lib.CRYPTO_set_id_callback( - _ffi.callback("unsigned long (*)(void)", get_ident)) - - _lib.CRYPTO_set_locking_callback( - _ffi.callback( - "void (*)(int, int, const char*, int)", locking_function)) - - -try: - from thread import get_ident - from threading import Lock -except ImportError: - pass -else: - _initialize_openssl_threads(get_ident, Lock) - del get_ident, Lock - -# There are no direct unit tests for this initialization. It is tested -# indirectly since it is necessary for functions like dump_privatekey when -# using encryption. -# -# Thus OpenSSL.test.test_crypto.FunctionTests.test_dump_privatekey_passphrase -# and some other similar tests may fail without this (though they may not if -# the Python runtime has already done some initialization of the underlying -# OpenSSL library (and is linked against the same one that cryptography is -# using)). -_lib.OpenSSL_add_all_algorithms() - -# This is similar but exercised mainly by exception_from_error_queue. It calls -# both ERR_load_crypto_strings() and ERR_load_SSL_strings(). -_lib.SSL_load_error_strings() diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/rand.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/rand.py deleted file mode 100644 index e754378..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/rand.py +++ /dev/null @@ -1,180 +0,0 @@ -""" -PRNG management routines, thin wrappers. - -See the file RATIONALE for a short explanation of why this module was written. -""" - -from functools import partial - -from six import integer_types as _integer_types - -from OpenSSL._util import ( - ffi as _ffi, - lib as _lib, - exception_from_error_queue as _exception_from_error_queue) - - -class Error(Exception): - """ - An error occurred in an `OpenSSL.rand` API. - """ - -_raise_current_error = partial(_exception_from_error_queue, Error) - -_unspecified = object() - -_builtin_bytes = bytes - -def bytes(num_bytes): - """ - Get some random bytes as a string. - - :param num_bytes: The number of bytes to fetch - :return: A string of random bytes - """ - if not isinstance(num_bytes, _integer_types): - raise TypeError("num_bytes must be an integer") - - if num_bytes < 0: - raise ValueError("num_bytes must not be negative") - - result_buffer = _ffi.new("char[]", num_bytes) - result_code = _lib.RAND_bytes(result_buffer, num_bytes) - if result_code == -1: - # TODO: No tests for this code path. Triggering a RAND_bytes failure - # might involve supplying a custom ENGINE? That's hard. - _raise_current_error() - - return _ffi.buffer(result_buffer)[:] - - - -def add(buffer, entropy): - """ - Add data with a given entropy to the PRNG - - :param buffer: Buffer with random data - :param entropy: The entropy (in bytes) measurement of the buffer - :return: None - """ - if not isinstance(buffer, _builtin_bytes): - raise TypeError("buffer must be a byte string") - - if not isinstance(entropy, int): - raise TypeError("entropy must be an integer") - - # TODO Nothing tests this call actually being made, or made properly. - _lib.RAND_add(buffer, len(buffer), entropy) - - - -def seed(buffer): - """ - Alias for rand_add, with entropy equal to length - - :param buffer: Buffer with random data - :return: None - """ - if not isinstance(buffer, _builtin_bytes): - raise TypeError("buffer must be a byte string") - - # TODO Nothing tests this call actually being made, or made properly. - _lib.RAND_seed(buffer, len(buffer)) - - - -def status(): - """ - Retrieve the status of the PRNG - - :return: True if the PRNG is seeded enough, false otherwise - """ - return _lib.RAND_status() - - - -def egd(path, bytes=_unspecified): - """ - Query an entropy gathering daemon (EGD) for random data and add it to the - PRNG. I haven't found any problems when the socket is missing, the function - just returns 0. - - :param path: The path to the EGD socket - :param bytes: (optional) The number of bytes to read, default is 255 - :returns: The number of bytes read (NB: a value of 0 isn't necessarily an - error, check rand.status()) - """ - if not isinstance(path, _builtin_bytes): - raise TypeError("path must be a byte string") - - if bytes is _unspecified: - bytes = 255 - elif not isinstance(bytes, int): - raise TypeError("bytes must be an integer") - - return _lib.RAND_egd_bytes(path, bytes) - - - -def cleanup(): - """ - Erase the memory used by the PRNG. - - :return: None - """ - # TODO Nothing tests this call actually being made, or made properly. - _lib.RAND_cleanup() - - - -def load_file(filename, maxbytes=_unspecified): - """ - Seed the PRNG with data from a file - - :param filename: The file to read data from - :param maxbytes: (optional) The number of bytes to read, default is - to read the entire file - :return: The number of bytes read - """ - if not isinstance(filename, _builtin_bytes): - raise TypeError("filename must be a string") - - if maxbytes is _unspecified: - maxbytes = -1 - elif not isinstance(maxbytes, int): - raise TypeError("maxbytes must be an integer") - - return _lib.RAND_load_file(filename, maxbytes) - - - -def write_file(filename): - """ - Save PRNG state to a file - - :param filename: The file to write data to - :return: The number of bytes written - """ - if not isinstance(filename, _builtin_bytes): - raise TypeError("filename must be a string") - - return _lib.RAND_write_file(filename) - - -# TODO There are no tests for screen at all -def screen(): - """ - Add the current contents of the screen to the PRNG state. Availability: - Windows. - - :return: None - """ - _lib.RAND_screen() - -if getattr(_lib, 'RAND_screen', None) is None: - del screen - - -# TODO There are no tests for the RAND strings being loaded, whatever that -# means. -_lib.ERR_load_RAND_strings() diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/__init__.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/__init__.py deleted file mode 100644 index 9b08060..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (C) Jean-Paul Calderone -# See LICENSE for details. - -""" -Package containing unit tests for :py:mod:`OpenSSL`. -""" diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_crypto.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_crypto.py deleted file mode 100644 index 4e42f70..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_crypto.py +++ /dev/null @@ -1,3037 +0,0 @@ -# Copyright (c) Jean-Paul Calderone -# See LICENSE file for details. - -""" -Unit tests for :py:mod:`OpenSSL.crypto`. -""" - -from unittest import main - -import os, re -from subprocess import PIPE, Popen -from datetime import datetime, timedelta - -from six import binary_type - -from OpenSSL.crypto import TYPE_RSA, TYPE_DSA, Error, PKey, PKeyType -from OpenSSL.crypto import X509, X509Type, X509Name, X509NameType -from OpenSSL.crypto import X509Store, X509StoreType, X509Req, X509ReqType -from OpenSSL.crypto import X509Extension, X509ExtensionType -from OpenSSL.crypto import load_certificate, load_privatekey -from OpenSSL.crypto import FILETYPE_PEM, FILETYPE_ASN1, FILETYPE_TEXT -from OpenSSL.crypto import dump_certificate, load_certificate_request -from OpenSSL.crypto import dump_certificate_request, dump_privatekey -from OpenSSL.crypto import PKCS7Type, load_pkcs7_data -from OpenSSL.crypto import PKCS12, PKCS12Type, load_pkcs12 -from OpenSSL.crypto import CRL, Revoked, load_crl -from OpenSSL.crypto import NetscapeSPKI, NetscapeSPKIType -from OpenSSL.crypto import sign, verify -from OpenSSL.test.util import TestCase, b -from OpenSSL._util import native - -def normalize_certificate_pem(pem): - return dump_certificate(FILETYPE_PEM, load_certificate(FILETYPE_PEM, pem)) - - -def normalize_privatekey_pem(pem): - return dump_privatekey(FILETYPE_PEM, load_privatekey(FILETYPE_PEM, pem)) - - -GOOD_CIPHER = "blowfish" -BAD_CIPHER = "zippers" - -GOOD_DIGEST = "MD5" -BAD_DIGEST = "monkeys" - -root_cert_pem = b("""-----BEGIN CERTIFICATE----- -MIIC7TCCAlagAwIBAgIIPQzE4MbeufQwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAklMMRAwDgYDVQQHEwdDaGljYWdvMRAwDgYDVQQKEwdU -ZXN0aW5nMRgwFgYDVQQDEw9UZXN0aW5nIFJvb3QgQ0EwIhgPMjAwOTAzMjUxMjM2 -NThaGA8yMDE3MDYxMTEyMzY1OFowWDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAklM -MRAwDgYDVQQHEwdDaGljYWdvMRAwDgYDVQQKEwdUZXN0aW5nMRgwFgYDVQQDEw9U -ZXN0aW5nIFJvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPmaQumL -urpE527uSEHdL1pqcDRmWzu+98Y6YHzT/J7KWEamyMCNZ6fRW1JCR782UQ8a07fy -2xXsKy4WdKaxyG8CcatwmXvpvRQ44dSANMihHELpANTdyVp6DCysED6wkQFurHlF -1dshEaJw8b/ypDhmbVIo6Ci1xvCJqivbLFnbAgMBAAGjgbswgbgwHQYDVR0OBBYE -FINVdy1eIfFJDAkk51QJEo3IfgSuMIGIBgNVHSMEgYAwfoAUg1V3LV4h8UkMCSTn -VAkSjch+BK6hXKRaMFgxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJJTDEQMA4GA1UE -BxMHQ2hpY2FnbzEQMA4GA1UEChMHVGVzdGluZzEYMBYGA1UEAxMPVGVzdGluZyBS -b290IENBggg9DMTgxt659DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GB -AGGCDazMJGoWNBpc03u6+smc95dEead2KlZXBATOdFT1VesY3+nUOqZhEhTGlDMi -hkgaZnzoIq/Uamidegk4hirsCT/R+6vsKAAxNTcBjUeZjlykCJWy5ojShGftXIKY -w/njVbKMXrvc83qmTdGl3TAM0fxQIpqgcglFLveEBgzn ------END CERTIFICATE----- -""") - -root_key_pem = b("""-----BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQD5mkLpi7q6ROdu7khB3S9aanA0Zls7vvfGOmB80/yeylhGpsjA -jWen0VtSQke/NlEPGtO38tsV7CsuFnSmschvAnGrcJl76b0UOOHUgDTIoRxC6QDU -3claegwsrBA+sJEBbqx5RdXbIRGicPG/8qQ4Zm1SKOgotcbwiaor2yxZ2wIDAQAB -AoGBAPCgMpmLxzwDaUmcFbTJUvlLW1hoxNNYSu2jIZm1k/hRAcE60JYwvBkgz3UB -yMEh0AtLxYe0bFk6EHah11tMUPgscbCq73snJ++8koUw+csk22G65hOs51bVb7Aa -6JBe67oLzdtvgCUFAA2qfrKzWRZzAdhUirQUZgySZk+Xq1pBAkEA/kZG0A6roTSM -BVnx7LnPfsycKUsTumorpXiylZJjTi9XtmzxhrYN6wgZlDOOwOLgSQhszGpxVoMD -u3gByT1b2QJBAPtL3mSKdvwRu/+40zaZLwvSJRxaj0mcE4BJOS6Oqs/hS1xRlrNk -PpQ7WJ4yM6ZOLnXzm2mKyxm50Mv64109FtMCQQDOqS2KkjHaLowTGVxwC0DijMfr -I9Lf8sSQk32J5VWCySWf5gGTfEnpmUa41gKTMJIbqZZLucNuDcOtzUaeWZlZAkA8 -ttXigLnCqR486JDPTi9ZscoZkZ+w7y6e/hH8t6d5Vjt48JVyfjPIaJY+km58LcN3 -6AWSeGAdtRFHVzR7oHjVAkB4hutvxiOeiIVQNBhM6RSI9aBPMI21DoX2JRoxvNW2 -cbvAhow217X9V0dVerEOKxnNYspXRrh36h7k4mQA+sDq ------END RSA PRIVATE KEY----- -""") - -server_cert_pem = b("""-----BEGIN CERTIFICATE----- -MIICKDCCAZGgAwIBAgIJAJn/HpR21r/8MA0GCSqGSIb3DQEBBQUAMFgxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJJTDEQMA4GA1UEBxMHQ2hpY2FnbzEQMA4GA1UEChMH -VGVzdGluZzEYMBYGA1UEAxMPVGVzdGluZyBSb290IENBMCIYDzIwMDkwMzI1MTIz -NzUzWhgPMjAxNzA2MTExMjM3NTNaMBgxFjAUBgNVBAMTDWxvdmVseSBzZXJ2ZXIw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL6m+G653V0tpBC/OKl22VxOi2Cv -lK4TYu9LHSDP9uDVTe7V5D5Tl6qzFoRRx5pfmnkqT5B+W9byp2NU3FC5hLm5zSAr -b45meUhjEJ/ifkZgbNUjHdBIGP9MAQUHZa5WKdkGIJvGAvs8UzUqlr4TBWQIB24+ -lJ+Ukk/CRgasrYwdAgMBAAGjNjA0MB0GA1UdDgQWBBS4kC7Ij0W1TZXZqXQFAM2e -gKEG2DATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQUFAAOBgQBh30Li -dJ+NlxIOx5343WqIBka3UbsOb2kxWrbkVCrvRapCMLCASO4FqiKWM+L0VDBprqIp -2mgpFQ6FHpoIENGvJhdEKpptQ5i7KaGhnDNTfdy3x1+h852G99f1iyj0RmbuFcM8 -uzujnS8YXWvM7DM1Ilozk4MzPug8jzFp5uhKCQ== ------END CERTIFICATE----- -""") - -server_key_pem = normalize_privatekey_pem(b("""-----BEGIN RSA PRIVATE KEY----- -MIICWwIBAAKBgQC+pvhuud1dLaQQvzipdtlcTotgr5SuE2LvSx0gz/bg1U3u1eQ+ -U5eqsxaEUceaX5p5Kk+QflvW8qdjVNxQuYS5uc0gK2+OZnlIYxCf4n5GYGzVIx3Q -SBj/TAEFB2WuVinZBiCbxgL7PFM1Kpa+EwVkCAduPpSflJJPwkYGrK2MHQIDAQAB -AoGAbwuZ0AR6JveahBaczjfnSpiFHf+mve2UxoQdpyr6ROJ4zg/PLW5K/KXrC48G -j6f3tXMrfKHcpEoZrQWUfYBRCUsGD5DCazEhD8zlxEHahIsqpwA0WWssJA2VOLEN -j6DuV2pCFbw67rfTBkTSo32ahfXxEKev5KswZk0JIzH3ooECQQDgzS9AI89h0gs8 -Dt+1m11Rzqo3vZML7ZIyGApUzVan+a7hbc33nbGRkAXjHaUBJO31it/H6dTO+uwX -msWwNG5ZAkEA2RyFKs5xR5USTFaKLWCgpH/ydV96KPOpBND7TKQx62snDenFNNbn -FwwOhpahld+vqhYk+pfuWWUpQciE+Bu7ZQJASjfT4sQv4qbbKK/scePicnDdx9th -4e1EeB9xwb+tXXXUo/6Bor/AcUNwfiQ6Zt9PZOK9sR3lMZSsP7rMi7kzuQJABie6 -1sXXjFH7nNJvRG4S39cIxq8YRYTy68II/dlB2QzGpKxV/POCxbJ/zu0CU79tuYK7 -NaeNCFfH3aeTrX0LyQJAMBWjWmeKM2G2sCExheeQK0ROnaBC8itCECD4Jsve4nqf -r50+LF74iLXFwqysVCebPKMOpDWp/qQ1BbJQIPs7/A== ------END RSA PRIVATE KEY----- -""")) - -client_cert_pem = b("""-----BEGIN CERTIFICATE----- -MIICJjCCAY+gAwIBAgIJAKxpFI5lODkjMA0GCSqGSIb3DQEBBQUAMFgxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJJTDEQMA4GA1UEBxMHQ2hpY2FnbzEQMA4GA1UEChMH -VGVzdGluZzEYMBYGA1UEAxMPVGVzdGluZyBSb290IENBMCIYDzIwMDkwMzI1MTIz -ODA1WhgPMjAxNzA2MTExMjM4MDVaMBYxFDASBgNVBAMTC3VnbHkgY2xpZW50MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAZh/SRtNm5ntMT4qb6YzEpTroMlq2 -rn+GrRHRiZ+xkCw/CGNhbtPir7/QxaUj26BSmQrHw1bGKEbPsWiW7bdXSespl+xK -iku4G/KvnnmWdeJHqsiXeUZtqurMELcPQAw9xPHEuhqqUJvvEoMTsnCEqGM+7Dtb -oCRajYyHfluARQIDAQABozYwNDAdBgNVHQ4EFgQUNQB+qkaOaEVecf1J3TTUtAff -0fAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEAyv/Jh7gM -Q3OHvmsFEEvRI+hsW8y66zK4K5de239Y44iZrFYkt7Q5nBPMEWDj4F2hLYWL/qtI -9Zdr0U4UDCU9SmmGYh4o7R4TZ5pGFvBYvjhHbkSFYFQXZxKUi+WUxplP6I0wr2KJ -PSTJCjJOn3xo2NTKRgV1gaoTf2EhL+RG8TQ= ------END CERTIFICATE----- -""") - -client_key_pem = normalize_privatekey_pem(b("""-----BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDAZh/SRtNm5ntMT4qb6YzEpTroMlq2rn+GrRHRiZ+xkCw/CGNh -btPir7/QxaUj26BSmQrHw1bGKEbPsWiW7bdXSespl+xKiku4G/KvnnmWdeJHqsiX -eUZtqurMELcPQAw9xPHEuhqqUJvvEoMTsnCEqGM+7DtboCRajYyHfluARQIDAQAB -AoGATkZ+NceY5Glqyl4mD06SdcKfV65814vg2EL7V9t8+/mi9rYL8KztSXGlQWPX -zuHgtRoMl78yQ4ZJYOBVo+nsx8KZNRCEBlE19bamSbQLCeQMenWnpeYyQUZ908gF -h6L9qsFVJepgA9RDgAjyDoS5CaWCdCCPCH2lDkdcqC54SVUCQQDseuduc4wi8h4t -V8AahUn9fn9gYfhoNuM0gdguTA0nPLVWz4hy1yJiWYQe0H7NLNNTmCKiLQaJpAbb -TC6vE8C7AkEA0Ee8CMJUc20BnGEmxwgWcVuqFWaKCo8jTH1X38FlATUsyR3krjW2 -dL3yDD9NwHxsYP7nTKp/U8MV7U9IBn4y/wJBAJl7H0/BcLeRmuJk7IqJ7b635iYB -D/9beFUw3MUXmQXZUfyYz39xf6CDZsu1GEdEC5haykeln3Of4M9d/4Kj+FcCQQCY -si6xwT7GzMDkk/ko684AV3KPc/h6G0yGtFIrMg7J3uExpR/VdH2KgwMkZXisSMvw -JJEQjOMCVsEJlRk54WWjAkEAzoZNH6UhDdBK5F38rVt/y4SEHgbSfJHIAmPS32Kq -f6GGcfNpip0Uk7q7udTKuX7Q/buZi/C4YW7u3VKAquv9NA== ------END RSA PRIVATE KEY----- -""")) - -cleartextCertificatePEM = b("""-----BEGIN CERTIFICATE----- -MIIC7TCCAlagAwIBAgIIPQzE4MbeufQwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAklMMRAwDgYDVQQHEwdDaGljYWdvMRAwDgYDVQQKEwdU -ZXN0aW5nMRgwFgYDVQQDEw9UZXN0aW5nIFJvb3QgQ0EwIhgPMjAwOTAzMjUxMjM2 -NThaGA8yMDE3MDYxMTEyMzY1OFowWDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAklM -MRAwDgYDVQQHEwdDaGljYWdvMRAwDgYDVQQKEwdUZXN0aW5nMRgwFgYDVQQDEw9U -ZXN0aW5nIFJvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPmaQumL -urpE527uSEHdL1pqcDRmWzu+98Y6YHzT/J7KWEamyMCNZ6fRW1JCR782UQ8a07fy -2xXsKy4WdKaxyG8CcatwmXvpvRQ44dSANMihHELpANTdyVp6DCysED6wkQFurHlF -1dshEaJw8b/ypDhmbVIo6Ci1xvCJqivbLFnbAgMBAAGjgbswgbgwHQYDVR0OBBYE -FINVdy1eIfFJDAkk51QJEo3IfgSuMIGIBgNVHSMEgYAwfoAUg1V3LV4h8UkMCSTn -VAkSjch+BK6hXKRaMFgxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJJTDEQMA4GA1UE -BxMHQ2hpY2FnbzEQMA4GA1UEChMHVGVzdGluZzEYMBYGA1UEAxMPVGVzdGluZyBS -b290IENBggg9DMTgxt659DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GB -AGGCDazMJGoWNBpc03u6+smc95dEead2KlZXBATOdFT1VesY3+nUOqZhEhTGlDMi -hkgaZnzoIq/Uamidegk4hirsCT/R+6vsKAAxNTcBjUeZjlykCJWy5ojShGftXIKY -w/njVbKMXrvc83qmTdGl3TAM0fxQIpqgcglFLveEBgzn ------END CERTIFICATE----- -""") - -cleartextPrivateKeyPEM = normalize_privatekey_pem(b("""\ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQD5mkLpi7q6ROdu7khB3S9aanA0Zls7vvfGOmB80/yeylhGpsjA -jWen0VtSQke/NlEPGtO38tsV7CsuFnSmschvAnGrcJl76b0UOOHUgDTIoRxC6QDU -3claegwsrBA+sJEBbqx5RdXbIRGicPG/8qQ4Zm1SKOgotcbwiaor2yxZ2wIDAQAB -AoGBAPCgMpmLxzwDaUmcFbTJUvlLW1hoxNNYSu2jIZm1k/hRAcE60JYwvBkgz3UB -yMEh0AtLxYe0bFk6EHah11tMUPgscbCq73snJ++8koUw+csk22G65hOs51bVb7Aa -6JBe67oLzdtvgCUFAA2qfrKzWRZzAdhUirQUZgySZk+Xq1pBAkEA/kZG0A6roTSM -BVnx7LnPfsycKUsTumorpXiylZJjTi9XtmzxhrYN6wgZlDOOwOLgSQhszGpxVoMD -u3gByT1b2QJBAPtL3mSKdvwRu/+40zaZLwvSJRxaj0mcE4BJOS6Oqs/hS1xRlrNk -PpQ7WJ4yM6ZOLnXzm2mKyxm50Mv64109FtMCQQDOqS2KkjHaLowTGVxwC0DijMfr -I9Lf8sSQk32J5VWCySWf5gGTfEnpmUa41gKTMJIbqZZLucNuDcOtzUaeWZlZAkA8 -ttXigLnCqR486JDPTi9ZscoZkZ+w7y6e/hH8t6d5Vjt48JVyfjPIaJY+km58LcN3 -6AWSeGAdtRFHVzR7oHjVAkB4hutvxiOeiIVQNBhM6RSI9aBPMI21DoX2JRoxvNW2 -cbvAhow217X9V0dVerEOKxnNYspXRrh36h7k4mQA+sDq ------END RSA PRIVATE KEY----- -""")) - -cleartextCertificateRequestPEM = b("""-----BEGIN CERTIFICATE REQUEST----- -MIIBnjCCAQcCAQAwXjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAklMMRAwDgYDVQQH -EwdDaGljYWdvMRcwFQYDVQQKEw5NeSBDb21wYW55IEx0ZDEXMBUGA1UEAxMORnJl -ZGVyaWNrIERlYW4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANp6Y17WzKSw -BsUWkXdqg6tnXy8H8hA1msCMWpc+/2KJ4mbv5NyD6UD+/SqagQqulPbF/DFea9nA -E0zhmHJELcM8gUTIlXv/cgDWnmK4xj8YkjVUiCdqKRAKeuzLG1pGmwwF5lGeJpXN -xQn5ecR0UYSOWj6TTGXB9VyUMQzCClcBAgMBAAGgADANBgkqhkiG9w0BAQUFAAOB -gQAAJGuF/R/GGbeC7FbFW+aJgr9ee0Xbl6nlhu7pTe67k+iiKT2dsl2ti68MVTnu -Vrb3HUNqOkiwsJf6kCtq5oPn3QVYzTa76Dt2y3Rtzv6boRSlmlfrgS92GNma8JfR -oICQk3nAudi6zl1Dix3BCv1pUp5KMtGn3MeDEi6QFGy2rA== ------END CERTIFICATE REQUEST----- -""") - -encryptedPrivateKeyPEM = b("""-----BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,9573604A18579E9E - -SHOho56WxDkT0ht10UTeKc0F5u8cqIa01kzFAmETw0MAs8ezYtK15NPdCXUm3X/2 -a17G7LSF5bkxOgZ7vpXyMzun/owrj7CzvLxyncyEFZWvtvzaAhPhvTJtTIB3kf8B -8+qRcpTGK7NgXEgYBW5bj1y4qZkD4zCL9o9NQzsKI3Ie8i0239jsDOWR38AxjXBH -mGwAQ4Z6ZN5dnmM4fhMIWsmFf19sNyAML4gHenQCHhmXbjXeVq47aC2ProInJbrm -+00TcisbAQ40V9aehVbcDKtS4ZbMVDwncAjpXpcncC54G76N6j7F7wL7L/FuXa3A -fvSVy9n2VfF/pJ3kYSflLHH2G/DFxjF7dl0GxhKPxJjp3IJi9VtuvmN9R2jZWLQF -tfC8dXgy/P9CfFQhlinqBTEwgH0oZ/d4k4NVFDSdEMaSdmBAjlHpc+Vfdty3HVnV -rKXj//wslsFNm9kIwJGIgKUa/n2jsOiydrsk1mgH7SmNCb3YHgZhbbnq0qLat/HC -gHDt3FHpNQ31QzzL3yrenFB2L9osIsnRsDTPFNi4RX4SpDgNroxOQmyzCCV6H+d4 -o1mcnNiZSdxLZxVKccq0AfRpHqpPAFnJcQHP6xyT9MZp6fBa0XkxDnt9kNU8H3Qw -7SJWZ69VXjBUzMlQViLuaWMgTnL+ZVyFZf9hTF7U/ef4HMLMAVNdiaGG+G+AjCV/ -MbzjS007Oe4qqBnCWaFPSnJX6uLApeTbqAxAeyCql56ULW5x6vDMNC3dwjvS/CEh -11n8RkgFIQA0AhuKSIg3CbuartRsJnWOLwgLTzsrKYL4yRog1RJrtw== ------END RSA PRIVATE KEY----- -""") - -encryptedPrivateKeyPEMPassphrase = b("foobar") - -# Some PKCS#7 stuff. Generated with the openssl command line: -# -# openssl crl2pkcs7 -inform pem -outform pem -certfile s.pem -nocrl -# -# with a certificate and key (but the key should be irrelevant) in s.pem -pkcs7Data = b("""\ ------BEGIN PKCS7----- -MIIDNwYJKoZIhvcNAQcCoIIDKDCCAyQCAQExADALBgkqhkiG9w0BBwGgggMKMIID -BjCCAm+gAwIBAgIBATANBgkqhkiG9w0BAQQFADB7MQswCQYDVQQGEwJTRzERMA8G -A1UEChMITTJDcnlwdG8xFDASBgNVBAsTC00yQ3J5cHRvIENBMSQwIgYDVQQDExtN -MkNyeXB0byBDZXJ0aWZpY2F0ZSBNYXN0ZXIxHTAbBgkqhkiG9w0BCQEWDm5ncHNA -cG9zdDEuY29tMB4XDTAwMDkxMDA5NTEzMFoXDTAyMDkxMDA5NTEzMFowUzELMAkG -A1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRIwEAYDVQQDEwlsb2NhbGhvc3Qx -HTAbBgkqhkiG9w0BCQEWDm5ncHNAcG9zdDEuY29tMFwwDQYJKoZIhvcNAQEBBQAD -SwAwSAJBAKy+e3dulvXzV7zoTZWc5TzgApr8DmeQHTYC8ydfzH7EECe4R1Xh5kwI -zOuuFfn178FBiS84gngaNcrFi0Z5fAkCAwEAAaOCAQQwggEAMAkGA1UdEwQCMAAw -LAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0G -A1UdDgQWBBTPhIKSvnsmYsBVNWjj0m3M2z0qVTCBpQYDVR0jBIGdMIGagBT7hyNp -65w6kxXlxb8pUU/+7Sg4AaF/pH0wezELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0y -Q3J5cHRvMRQwEgYDVQQLEwtNMkNyeXB0byBDQTEkMCIGA1UEAxMbTTJDcnlwdG8g -Q2VydGlmaWNhdGUgTWFzdGVyMR0wGwYJKoZIhvcNAQkBFg5uZ3BzQHBvc3QxLmNv -bYIBADANBgkqhkiG9w0BAQQFAAOBgQA7/CqT6PoHycTdhEStWNZde7M/2Yc6BoJu -VwnW8YxGO8Sn6UJ4FeffZNcYZddSDKosw8LtPOeWoK3JINjAk5jiPQ2cww++7QGG -/g5NDjxFZNDJP1dGiLAxPW6JXwov4v0FmdzfLOZ01jDcgQQZqEpYlgpuI5JEWUQ9 -Ho4EzbYCOaEAMQA= ------END PKCS7----- -""") - -crlData = b("""\ ------BEGIN X509 CRL----- -MIIBWzCBxTANBgkqhkiG9w0BAQQFADBYMQswCQYDVQQGEwJVUzELMAkGA1UECBMC -SUwxEDAOBgNVBAcTB0NoaWNhZ28xEDAOBgNVBAoTB1Rlc3RpbmcxGDAWBgNVBAMT -D1Rlc3RpbmcgUm9vdCBDQRcNMDkwNzI2MDQzNDU2WhcNMTIwOTI3MDI0MTUyWjA8 -MBUCAgOrGA8yMDA5MDcyNTIzMzQ1NlowIwICAQAYDzIwMDkwNzI1MjMzNDU2WjAM -MAoGA1UdFQQDCgEEMA0GCSqGSIb3DQEBBAUAA4GBAEBt7xTs2htdD3d4ErrcGAw1 -4dKcVnIWTutoI7xxen26Wwvh8VCsT7i/UeP+rBl9rC/kfjWjzQk3/zleaarGTpBT -0yp4HXRFFoRhhSE/hP+eteaPXRgrsNRLHe9ZDd69wmh7J1wMDb0m81RG7kqcbsid -vrzEeLDRiiPl92dyyWmu ------END X509 CRL----- -""") - - -# A broken RSA private key which can be used to test the error path through -# PKey.check. -inconsistentPrivateKeyPEM = b("""-----BEGIN RSA PRIVATE KEY----- -MIIBPAIBAAJBAKy+e3dulvXzV7zoTZWc5TzgApr8DmeQHTYC8ydfzH7EECe4R1Xh -5kwIzOuuFfn178FBiS84gngaNcrFi0Z5fAkCAwEaAQJBAIqm/bz4NA1H++Vx5Ewx -OcKp3w19QSaZAwlGRtsUxrP7436QjnREM3Bm8ygU11BjkPVmtrKm6AayQfCHqJoT -zIECIQDW0BoMoL0HOYM/mrTLhaykYAVqgIeJsPjvkEhTFXWBuQIhAM3deFAvWNu4 -nklUQ37XsCT2c9tmNt1LAT+slG2JOTTRAiAuXDtC/m3NYVwyHfFm+zKHRzHkClk2 -HjubeEgjpj32AQIhAJqMGTaZVOwevTXvvHwNeH+vRWsAYU/gbx+OQB+7VOcBAiEA -oolb6NMg/R3enNPvS1O4UU1H8wpaF77L4yiSWlE0p4w= ------END RSA PRIVATE KEY----- -""") - -# certificate with NULL bytes in subjectAltName and common name - -nulbyteSubjectAltNamePEM = b("""-----BEGIN CERTIFICATE----- -MIIE2DCCA8CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBxTELMAkGA1UEBhMCVVMx -DzANBgNVBAgMBk9yZWdvbjESMBAGA1UEBwwJQmVhdmVydG9uMSMwIQYDVQQKDBpQ -eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjEgMB4GA1UECwwXUHl0aG9uIENvcmUg -RGV2ZWxvcG1lbnQxJDAiBgNVBAMMG251bGwucHl0aG9uLm9yZwBleGFtcGxlLm9y -ZzEkMCIGCSqGSIb3DQEJARYVcHl0aG9uLWRldkBweXRob24ub3JnMB4XDTEzMDgw -NzEzMTE1MloXDTEzMDgwNzEzMTI1MlowgcUxCzAJBgNVBAYTAlVTMQ8wDQYDVQQI -DAZPcmVnb24xEjAQBgNVBAcMCUJlYXZlcnRvbjEjMCEGA1UECgwaUHl0aG9uIFNv -ZnR3YXJlIEZvdW5kYXRpb24xIDAeBgNVBAsMF1B5dGhvbiBDb3JlIERldmVsb3Bt -ZW50MSQwIgYDVQQDDBtudWxsLnB5dGhvbi5vcmcAZXhhbXBsZS5vcmcxJDAiBgkq -hkiG9w0BCQEWFXB5dGhvbi1kZXZAcHl0aG9uLm9yZzCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBALXq7cn7Rn1vO3aA3TrzA5QLp6bb7B3f/yN0CJ2XFj+j -pHs+Gw6WWSUDpybiiKnPec33BFawq3kyblnBMjBU61ioy5HwQqVkJ8vUVjGIUq3P -vX/wBmQfzCe4o4uM89gpHyUL9UYGG8oCRa17dgqcv7u5rg0Wq2B1rgY+nHwx3JIv -KRrgSwyRkGzpN8WQ1yrXlxWjgI9de0mPVDDUlywcWze1q2kwaEPTM3hLAmD1PESA -oY/n8A/RXoeeRs9i/Pm/DGUS8ZPINXk/yOzsR/XvvkTVroIeLZqfmFpnZeF0cHzL -08LODkVJJ9zjLdT7SA4vnne4FEbAxDbKAq5qkYzaL4UCAwEAAaOB0DCBzTAMBgNV -HRMBAf8EAjAAMB0GA1UdDgQWBBSIWlXAUv9hzVKjNQ/qWpwkOCL3XDALBgNVHQ8E -BAMCBeAwgZAGA1UdEQSBiDCBhYIeYWx0bnVsbC5weXRob24ub3JnAGV4YW1wbGUu -Y29tgSBudWxsQHB5dGhvbi5vcmcAdXNlckBleGFtcGxlLm9yZ4YpaHR0cDovL251 -bGwucHl0aG9uLm9yZwBodHRwOi8vZXhhbXBsZS5vcmeHBMAAAgGHECABDbgAAAAA -AAAAAAAAAAEwDQYJKoZIhvcNAQEFBQADggEBAKxPRe99SaghcI6IWT7UNkJw9aO9 -i9eo0Fj2MUqxpKbdb9noRDy2CnHWf7EIYZ1gznXPdwzSN4YCjV5d+Q9xtBaowT0j -HPERs1ZuytCNNJTmhyqZ8q6uzMLoht4IqH/FBfpvgaeC5tBTnTT0rD5A/olXeimk -kX4LxlEx5RAvpGB2zZVRGr6LobD9rVK91xuHYNIxxxfEGE8tCCWjp0+3ksri9SXx -VHWBnbM9YaL32u3hxm8sYB/Yb8WSBavJCWJJqRStVRHM1koZlJmXNx2BX4vPo6iW -RFEIPQsFZRLrtnCAiEhyT8bC2s/Njlu6ly9gtJZWSV46Q3ZjBL4q9sHKqZQ= ------END CERTIFICATE-----""") - - -class X509ExtTests(TestCase): - """ - Tests for :py:class:`OpenSSL.crypto.X509Extension`. - """ - - def setUp(self): - """ - Create a new private key and start a certificate request (for a test - method to finish in one way or another). - """ - super(X509ExtTests, self).setUp() - # Basic setup stuff to generate a certificate - self.pkey = PKey() - self.pkey.generate_key(TYPE_RSA, 384) - self.req = X509Req() - self.req.set_pubkey(self.pkey) - # Authority good you have. - self.req.get_subject().commonName = "Yoda root CA" - self.x509 = X509() - self.subject = self.x509.get_subject() - self.subject.commonName = self.req.get_subject().commonName - self.x509.set_issuer(self.subject) - self.x509.set_pubkey(self.pkey) - now = b(datetime.now().strftime("%Y%m%d%H%M%SZ")) - expire = b((datetime.now() + timedelta(days=100)).strftime("%Y%m%d%H%M%SZ")) - self.x509.set_notBefore(now) - self.x509.set_notAfter(expire) - - - def tearDown(self): - """ - Forget all of the pyOpenSSL objects so they can be garbage collected, - their memory released, and not interfere with the leak detection code. - """ - self.pkey = self.req = self.x509 = self.subject = None - super(X509ExtTests, self).tearDown() - - - def test_str(self): - """ - The string representation of :py:class:`X509Extension` instances as returned by - :py:data:`str` includes stuff. - """ - # This isn't necessarily the best string representation. Perhaps it - # will be changed/improved in the future. - self.assertEquals( - str(X509Extension(b('basicConstraints'), True, b('CA:false'))), - 'CA:FALSE') - - - def test_type(self): - """ - :py:class:`X509Extension` and :py:class:`X509ExtensionType` refer to the same type object - and can be used to create instances of that type. - """ - self.assertIdentical(X509Extension, X509ExtensionType) - self.assertConsistentType( - X509Extension, - 'X509Extension', b('basicConstraints'), True, b('CA:true')) - - - def test_construction(self): - """ - :py:class:`X509Extension` accepts an extension type name, a critical flag, - and an extension value and returns an :py:class:`X509ExtensionType` instance. - """ - basic = X509Extension(b('basicConstraints'), True, b('CA:true')) - self.assertTrue( - isinstance(basic, X509ExtensionType), - "%r is of type %r, should be %r" % ( - basic, type(basic), X509ExtensionType)) - - comment = X509Extension( - b('nsComment'), False, b('pyOpenSSL unit test')) - self.assertTrue( - isinstance(comment, X509ExtensionType), - "%r is of type %r, should be %r" % ( - comment, type(comment), X509ExtensionType)) - - - def test_invalid_extension(self): - """ - :py:class:`X509Extension` raises something if it is passed a bad extension - name or value. - """ - self.assertRaises( - Error, X509Extension, b('thisIsMadeUp'), False, b('hi')) - self.assertRaises( - Error, X509Extension, b('basicConstraints'), False, b('blah blah')) - - # Exercise a weird one (an extension which uses the r2i method). This - # exercises the codepath that requires a non-NULL ctx to be passed to - # X509V3_EXT_nconf. It can't work now because we provide no - # configuration database. It might be made to work in the future. - self.assertRaises( - Error, X509Extension, b('proxyCertInfo'), True, - b('language:id-ppl-anyLanguage,pathlen:1,policy:text:AB')) - - - def test_get_critical(self): - """ - :py:meth:`X509ExtensionType.get_critical` returns the value of the - extension's critical flag. - """ - ext = X509Extension(b('basicConstraints'), True, b('CA:true')) - self.assertTrue(ext.get_critical()) - ext = X509Extension(b('basicConstraints'), False, b('CA:true')) - self.assertFalse(ext.get_critical()) - - - def test_get_short_name(self): - """ - :py:meth:`X509ExtensionType.get_short_name` returns a string giving the short - type name of the extension. - """ - ext = X509Extension(b('basicConstraints'), True, b('CA:true')) - self.assertEqual(ext.get_short_name(), b('basicConstraints')) - ext = X509Extension(b('nsComment'), True, b('foo bar')) - self.assertEqual(ext.get_short_name(), b('nsComment')) - - - def test_get_data(self): - """ - :py:meth:`X509Extension.get_data` returns a string giving the data of the - extension. - """ - ext = X509Extension(b('basicConstraints'), True, b('CA:true')) - # Expect to get back the DER encoded form of CA:true. - self.assertEqual(ext.get_data(), b('0\x03\x01\x01\xff')) - - - def test_get_data_wrong_args(self): - """ - :py:meth:`X509Extension.get_data` raises :py:exc:`TypeError` if passed any arguments. - """ - ext = X509Extension(b('basicConstraints'), True, b('CA:true')) - self.assertRaises(TypeError, ext.get_data, None) - self.assertRaises(TypeError, ext.get_data, "foo") - self.assertRaises(TypeError, ext.get_data, 7) - - - def test_unused_subject(self): - """ - The :py:data:`subject` parameter to :py:class:`X509Extension` may be provided for an - extension which does not use it and is ignored in this case. - """ - ext1 = X509Extension( - b('basicConstraints'), False, b('CA:TRUE'), subject=self.x509) - self.x509.add_extensions([ext1]) - self.x509.sign(self.pkey, 'sha1') - # This is a little lame. Can we think of a better way? - text = dump_certificate(FILETYPE_TEXT, self.x509) - self.assertTrue(b('X509v3 Basic Constraints:') in text) - self.assertTrue(b('CA:TRUE') in text) - - - def test_subject(self): - """ - If an extension requires a subject, the :py:data:`subject` parameter to - :py:class:`X509Extension` provides its value. - """ - ext3 = X509Extension( - b('subjectKeyIdentifier'), False, b('hash'), subject=self.x509) - self.x509.add_extensions([ext3]) - self.x509.sign(self.pkey, 'sha1') - text = dump_certificate(FILETYPE_TEXT, self.x509) - self.assertTrue(b('X509v3 Subject Key Identifier:') in text) - - - def test_missing_subject(self): - """ - If an extension requires a subject and the :py:data:`subject` parameter is - given no value, something happens. - """ - self.assertRaises( - Error, X509Extension, b('subjectKeyIdentifier'), False, b('hash')) - - - def test_invalid_subject(self): - """ - If the :py:data:`subject` parameter is given a value which is not an - :py:class:`X509` instance, :py:exc:`TypeError` is raised. - """ - for badObj in [True, object(), "hello", [], self]: - self.assertRaises( - TypeError, - X509Extension, - 'basicConstraints', False, 'CA:TRUE', subject=badObj) - - - def test_unused_issuer(self): - """ - The :py:data:`issuer` parameter to :py:class:`X509Extension` may be provided for an - extension which does not use it and is ignored in this case. - """ - ext1 = X509Extension( - b('basicConstraints'), False, b('CA:TRUE'), issuer=self.x509) - self.x509.add_extensions([ext1]) - self.x509.sign(self.pkey, 'sha1') - text = dump_certificate(FILETYPE_TEXT, self.x509) - self.assertTrue(b('X509v3 Basic Constraints:') in text) - self.assertTrue(b('CA:TRUE') in text) - - - def test_issuer(self): - """ - If an extension requires a issuer, the :py:data:`issuer` parameter to - :py:class:`X509Extension` provides its value. - """ - ext2 = X509Extension( - b('authorityKeyIdentifier'), False, b('issuer:always'), - issuer=self.x509) - self.x509.add_extensions([ext2]) - self.x509.sign(self.pkey, 'sha1') - text = dump_certificate(FILETYPE_TEXT, self.x509) - self.assertTrue(b('X509v3 Authority Key Identifier:') in text) - self.assertTrue(b('DirName:/CN=Yoda root CA') in text) - - - def test_missing_issuer(self): - """ - If an extension requires an issue and the :py:data:`issuer` parameter is given - no value, something happens. - """ - self.assertRaises( - Error, - X509Extension, - b('authorityKeyIdentifier'), False, - b('keyid:always,issuer:always')) - - - def test_invalid_issuer(self): - """ - If the :py:data:`issuer` parameter is given a value which is not an - :py:class:`X509` instance, :py:exc:`TypeError` is raised. - """ - for badObj in [True, object(), "hello", [], self]: - self.assertRaises( - TypeError, - X509Extension, - 'authorityKeyIdentifier', False, 'keyid:always,issuer:always', - issuer=badObj) - - - -class PKeyTests(TestCase): - """ - Unit tests for :py:class:`OpenSSL.crypto.PKey`. - """ - def test_type(self): - """ - :py:class:`PKey` and :py:class:`PKeyType` refer to the same type object - and can be used to create instances of that type. - """ - self.assertIdentical(PKey, PKeyType) - self.assertConsistentType(PKey, 'PKey') - - - def test_construction(self): - """ - :py:class:`PKey` takes no arguments and returns a new :py:class:`PKey` instance. - """ - self.assertRaises(TypeError, PKey, None) - key = PKey() - self.assertTrue( - isinstance(key, PKeyType), - "%r is of type %r, should be %r" % (key, type(key), PKeyType)) - - - def test_pregeneration(self): - """ - :py:attr:`PKeyType.bits` and :py:attr:`PKeyType.type` return :py:data:`0` before the key is - generated. :py:attr:`PKeyType.check` raises :py:exc:`TypeError` before the key is - generated. - """ - key = PKey() - self.assertEqual(key.type(), 0) - self.assertEqual(key.bits(), 0) - self.assertRaises(TypeError, key.check) - - - def test_failedGeneration(self): - """ - :py:meth:`PKeyType.generate_key` takes two arguments, the first giving the key - type as one of :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA` and the second giving the - number of bits to generate. If an invalid type is specified or - generation fails, :py:exc:`Error` is raised. If an invalid number of bits is - specified, :py:exc:`ValueError` or :py:exc:`Error` is raised. - """ - key = PKey() - self.assertRaises(TypeError, key.generate_key) - self.assertRaises(TypeError, key.generate_key, 1, 2, 3) - self.assertRaises(TypeError, key.generate_key, "foo", "bar") - self.assertRaises(Error, key.generate_key, -1, 0) - - self.assertRaises(ValueError, key.generate_key, TYPE_RSA, -1) - self.assertRaises(ValueError, key.generate_key, TYPE_RSA, 0) - - # XXX RSA generation for small values of bits is fairly buggy in a wide - # range of OpenSSL versions. I need to figure out what the safe lower - # bound for a reasonable number of OpenSSL versions is and explicitly - # check for that in the wrapper. The failure behavior is typically an - # infinite loop inside OpenSSL. - - # self.assertRaises(Error, key.generate_key, TYPE_RSA, 2) - - # XXX DSA generation seems happy with any number of bits. The DSS - # says bits must be between 512 and 1024 inclusive. OpenSSL's DSA - # generator doesn't seem to care about the upper limit at all. For - # the lower limit, it uses 512 if anything smaller is specified. - # So, it doesn't seem possible to make generate_key fail for - # TYPE_DSA with a bits argument which is at least an int. - - # self.assertRaises(Error, key.generate_key, TYPE_DSA, -7) - - - def test_rsaGeneration(self): - """ - :py:meth:`PKeyType.generate_key` generates an RSA key when passed - :py:data:`TYPE_RSA` as a type and a reasonable number of bits. - """ - bits = 128 - key = PKey() - key.generate_key(TYPE_RSA, bits) - self.assertEqual(key.type(), TYPE_RSA) - self.assertEqual(key.bits(), bits) - self.assertTrue(key.check()) - - - def test_dsaGeneration(self): - """ - :py:meth:`PKeyType.generate_key` generates a DSA key when passed - :py:data:`TYPE_DSA` as a type and a reasonable number of bits. - """ - # 512 is a magic number. The DSS (Digital Signature Standard) - # allows a minimum of 512 bits for DSA. DSA_generate_parameters - # will silently promote any value below 512 to 512. - bits = 512 - key = PKey() - key.generate_key(TYPE_DSA, bits) - # self.assertEqual(key.type(), TYPE_DSA) - # self.assertEqual(key.bits(), bits) - # self.assertRaises(TypeError, key.check) - - - def test_regeneration(self): - """ - :py:meth:`PKeyType.generate_key` can be called multiple times on the same - key to generate new keys. - """ - key = PKey() - for type, bits in [(TYPE_RSA, 512), (TYPE_DSA, 576)]: - key.generate_key(type, bits) - self.assertEqual(key.type(), type) - self.assertEqual(key.bits(), bits) - - - def test_inconsistentKey(self): - """ - :py:`PKeyType.check` returns :py:exc:`Error` if the key is not consistent. - """ - key = load_privatekey(FILETYPE_PEM, inconsistentPrivateKeyPEM) - self.assertRaises(Error, key.check) - - - def test_check_wrong_args(self): - """ - :py:meth:`PKeyType.check` raises :py:exc:`TypeError` if called with any arguments. - """ - self.assertRaises(TypeError, PKey().check, None) - self.assertRaises(TypeError, PKey().check, object()) - self.assertRaises(TypeError, PKey().check, 1) - - - def test_check_public_key(self): - """ - :py:meth:`PKeyType.check` raises :py:exc:`TypeError` if only the public - part of the key is available. - """ - # A trick to get a public-only key - key = PKey() - key.generate_key(TYPE_RSA, 512) - cert = X509() - cert.set_pubkey(key) - pub = cert.get_pubkey() - self.assertRaises(TypeError, pub.check) - - - -class X509NameTests(TestCase): - """ - Unit tests for :py:class:`OpenSSL.crypto.X509Name`. - """ - def _x509name(self, **attrs): - # XXX There's no other way to get a new X509Name yet. - name = X509().get_subject() - attrs = list(attrs.items()) - # Make the order stable - order matters! - def key(attr): - return attr[1] - attrs.sort(key=key) - for k, v in attrs: - setattr(name, k, v) - return name - - - def test_type(self): - """ - The type of X509Name objects is :py:class:`X509NameType`. - """ - self.assertIdentical(X509Name, X509NameType) - self.assertEqual(X509NameType.__name__, 'X509Name') - self.assertTrue(isinstance(X509NameType, type)) - - name = self._x509name() - self.assertTrue( - isinstance(name, X509NameType), - "%r is of type %r, should be %r" % ( - name, type(name), X509NameType)) - - - def test_onlyStringAttributes(self): - """ - Attempting to set a non-:py:data:`str` attribute name on an :py:class:`X509NameType` - instance causes :py:exc:`TypeError` to be raised. - """ - name = self._x509name() - # Beyond these cases, you may also think that unicode should be - # rejected. Sorry, you're wrong. unicode is automatically converted to - # str outside of the control of X509Name, so there's no way to reject - # it. - - # Also, this used to test str subclasses, but that test is less relevant - # now that the implementation is in Python instead of C. Also PyPy - # automatically converts str subclasses to str when they are passed to - # setattr, so we can't test it on PyPy. Apparently CPython does this - # sometimes as well. - self.assertRaises(TypeError, setattr, name, None, "hello") - self.assertRaises(TypeError, setattr, name, 30, "hello") - - - def test_setInvalidAttribute(self): - """ - Attempting to set any attribute name on an :py:class:`X509NameType` instance for - which no corresponding NID is defined causes :py:exc:`AttributeError` to be - raised. - """ - name = self._x509name() - self.assertRaises(AttributeError, setattr, name, "no such thing", None) - - - def test_attributes(self): - """ - :py:class:`X509NameType` instances have attributes for each standard (?) - X509Name field. - """ - name = self._x509name() - name.commonName = "foo" - self.assertEqual(name.commonName, "foo") - self.assertEqual(name.CN, "foo") - name.CN = "baz" - self.assertEqual(name.commonName, "baz") - self.assertEqual(name.CN, "baz") - name.commonName = "bar" - self.assertEqual(name.commonName, "bar") - self.assertEqual(name.CN, "bar") - name.CN = "quux" - self.assertEqual(name.commonName, "quux") - self.assertEqual(name.CN, "quux") - - - def test_copy(self): - """ - :py:class:`X509Name` creates a new :py:class:`X509NameType` instance with all the same - attributes as an existing :py:class:`X509NameType` instance when called with - one. - """ - name = self._x509name(commonName="foo", emailAddress="bar@example.com") - - copy = X509Name(name) - self.assertEqual(copy.commonName, "foo") - self.assertEqual(copy.emailAddress, "bar@example.com") - - # Mutate the copy and ensure the original is unmodified. - copy.commonName = "baz" - self.assertEqual(name.commonName, "foo") - - # Mutate the original and ensure the copy is unmodified. - name.emailAddress = "quux@example.com" - self.assertEqual(copy.emailAddress, "bar@example.com") - - - def test_repr(self): - """ - :py:func:`repr` passed an :py:class:`X509NameType` instance should return a string - containing a description of the type and the NIDs which have been set - on it. - """ - name = self._x509name(commonName="foo", emailAddress="bar") - self.assertEqual( - repr(name), - "") - - - def test_comparison(self): - """ - :py:class:`X509NameType` instances should compare based on their NIDs. - """ - def _equality(a, b, assertTrue, assertFalse): - assertTrue(a == b, "(%r == %r) --> False" % (a, b)) - assertFalse(a != b) - assertTrue(b == a) - assertFalse(b != a) - - def assertEqual(a, b): - _equality(a, b, self.assertTrue, self.assertFalse) - - # Instances compare equal to themselves. - name = self._x509name() - assertEqual(name, name) - - # Empty instances should compare equal to each other. - assertEqual(self._x509name(), self._x509name()) - - # Instances with equal NIDs should compare equal to each other. - assertEqual(self._x509name(commonName="foo"), - self._x509name(commonName="foo")) - - # Instance with equal NIDs set using different aliases should compare - # equal to each other. - assertEqual(self._x509name(commonName="foo"), - self._x509name(CN="foo")) - - # Instances with more than one NID with the same values should compare - # equal to each other. - assertEqual(self._x509name(CN="foo", organizationalUnitName="bar"), - self._x509name(commonName="foo", OU="bar")) - - def assertNotEqual(a, b): - _equality(a, b, self.assertFalse, self.assertTrue) - - # Instances with different values for the same NID should not compare - # equal to each other. - assertNotEqual(self._x509name(CN="foo"), - self._x509name(CN="bar")) - - # Instances with different NIDs should not compare equal to each other. - assertNotEqual(self._x509name(CN="foo"), - self._x509name(OU="foo")) - - def _inequality(a, b, assertTrue, assertFalse): - assertTrue(a < b) - assertTrue(a <= b) - assertTrue(b > a) - assertTrue(b >= a) - assertFalse(a > b) - assertFalse(a >= b) - assertFalse(b < a) - assertFalse(b <= a) - - def assertLessThan(a, b): - _inequality(a, b, self.assertTrue, self.assertFalse) - - # An X509Name with a NID with a value which sorts less than the value - # of the same NID on another X509Name compares less than the other - # X509Name. - assertLessThan(self._x509name(CN="abc"), - self._x509name(CN="def")) - - def assertGreaterThan(a, b): - _inequality(a, b, self.assertFalse, self.assertTrue) - - # An X509Name with a NID with a value which sorts greater than the - # value of the same NID on another X509Name compares greater than the - # other X509Name. - assertGreaterThan(self._x509name(CN="def"), - self._x509name(CN="abc")) - - - def test_hash(self): - """ - :py:meth:`X509Name.hash` returns an integer hash based on the value of the - name. - """ - a = self._x509name(CN="foo") - b = self._x509name(CN="foo") - self.assertEqual(a.hash(), b.hash()) - a.CN = "bar" - self.assertNotEqual(a.hash(), b.hash()) - - - def test_der(self): - """ - :py:meth:`X509Name.der` returns the DER encoded form of the name. - """ - a = self._x509name(CN="foo", C="US") - self.assertEqual( - a.der(), - b('0\x1b1\x0b0\t\x06\x03U\x04\x06\x13\x02US' - '1\x0c0\n\x06\x03U\x04\x03\x13\x03foo')) - - - def test_get_components(self): - """ - :py:meth:`X509Name.get_components` returns a :py:data:`list` of - two-tuples of :py:data:`str` - giving the NIDs and associated values which make up the name. - """ - a = self._x509name() - self.assertEqual(a.get_components(), []) - a.CN = "foo" - self.assertEqual(a.get_components(), [(b("CN"), b("foo"))]) - a.organizationalUnitName = "bar" - self.assertEqual( - a.get_components(), - [(b("CN"), b("foo")), (b("OU"), b("bar"))]) - - - def test_load_nul_byte_attribute(self): - """ - An :py:class:`OpenSSL.crypto.X509Name` from an - :py:class:`OpenSSL.crypto.X509` instance loaded from a file can have a - NUL byte in the value of one of its attributes. - """ - cert = load_certificate(FILETYPE_PEM, nulbyteSubjectAltNamePEM) - subject = cert.get_subject() - self.assertEqual( - "null.python.org\x00example.org", subject.commonName) - - - def test_setAttributeFailure(self): - """ - If the value of an attribute cannot be set for some reason then - :py:class:`OpenSSL.crypto.Error` is raised. - """ - name = self._x509name() - # This value is too long - self.assertRaises(Error, setattr, name, "O", b"x" * 512) - - - -class _PKeyInteractionTestsMixin: - """ - Tests which involve another thing and a PKey. - """ - def signable(self): - """ - Return something with a :py:meth:`set_pubkey`, :py:meth:`set_pubkey`, - and :py:meth:`sign` method. - """ - raise NotImplementedError() - - - def test_signWithUngenerated(self): - """ - :py:meth:`X509Req.sign` raises :py:exc:`ValueError` when pass a - :py:class:`PKey` with no parts. - """ - request = self.signable() - key = PKey() - self.assertRaises(ValueError, request.sign, key, GOOD_DIGEST) - - - def test_signWithPublicKey(self): - """ - :py:meth:`X509Req.sign` raises :py:exc:`ValueError` when pass a - :py:class:`PKey` with no private part as the signing key. - """ - request = self.signable() - key = PKey() - key.generate_key(TYPE_RSA, 512) - request.set_pubkey(key) - pub = request.get_pubkey() - self.assertRaises(ValueError, request.sign, pub, GOOD_DIGEST) - - - def test_signWithUnknownDigest(self): - """ - :py:meth:`X509Req.sign` raises :py:exc:`ValueError` when passed a digest name which is - not known. - """ - request = self.signable() - key = PKey() - key.generate_key(TYPE_RSA, 512) - self.assertRaises(ValueError, request.sign, key, BAD_DIGEST) - - - def test_sign(self): - """ - :py:meth:`X509Req.sign` succeeds when passed a private key object and a valid - digest function. :py:meth:`X509Req.verify` can be used to check the signature. - """ - request = self.signable() - key = PKey() - key.generate_key(TYPE_RSA, 512) - request.set_pubkey(key) - request.sign(key, GOOD_DIGEST) - # If the type has a verify method, cover that too. - if getattr(request, 'verify', None) is not None: - pub = request.get_pubkey() - self.assertTrue(request.verify(pub)) - # Make another key that won't verify. - key = PKey() - key.generate_key(TYPE_RSA, 512) - self.assertRaises(Error, request.verify, key) - - - - -class X509ReqTests(TestCase, _PKeyInteractionTestsMixin): - """ - Tests for :py:class:`OpenSSL.crypto.X509Req`. - """ - def signable(self): - """ - Create and return a new :py:class:`X509Req`. - """ - return X509Req() - - - def test_type(self): - """ - :py:obj:`X509Req` and :py:obj:`X509ReqType` refer to the same type object and can be - used to create instances of that type. - """ - self.assertIdentical(X509Req, X509ReqType) - self.assertConsistentType(X509Req, 'X509Req') - - - def test_construction(self): - """ - :py:obj:`X509Req` takes no arguments and returns an :py:obj:`X509ReqType` instance. - """ - request = X509Req() - self.assertTrue( - isinstance(request, X509ReqType), - "%r is of type %r, should be %r" % (request, type(request), X509ReqType)) - - - def test_version(self): - """ - :py:obj:`X509ReqType.set_version` sets the X.509 version of the certificate - request. :py:obj:`X509ReqType.get_version` returns the X.509 version of - the certificate request. The initial value of the version is 0. - """ - request = X509Req() - self.assertEqual(request.get_version(), 0) - request.set_version(1) - self.assertEqual(request.get_version(), 1) - request.set_version(3) - self.assertEqual(request.get_version(), 3) - - - def test_version_wrong_args(self): - """ - :py:obj:`X509ReqType.set_version` raises :py:obj:`TypeError` if called with the wrong - number of arguments or with a non-:py:obj:`int` argument. - :py:obj:`X509ReqType.get_version` raises :py:obj:`TypeError` if called with any - arguments. - """ - request = X509Req() - self.assertRaises(TypeError, request.set_version) - self.assertRaises(TypeError, request.set_version, "foo") - self.assertRaises(TypeError, request.set_version, 1, 2) - self.assertRaises(TypeError, request.get_version, None) - - - def test_get_subject(self): - """ - :py:obj:`X509ReqType.get_subject` returns an :py:obj:`X509Name` for the subject of - the request and which is valid even after the request object is - otherwise dead. - """ - request = X509Req() - subject = request.get_subject() - self.assertTrue( - isinstance(subject, X509NameType), - "%r is of type %r, should be %r" % (subject, type(subject), X509NameType)) - subject.commonName = "foo" - self.assertEqual(request.get_subject().commonName, "foo") - del request - subject.commonName = "bar" - self.assertEqual(subject.commonName, "bar") - - - def test_get_subject_wrong_args(self): - """ - :py:obj:`X509ReqType.get_subject` raises :py:obj:`TypeError` if called with any - arguments. - """ - request = X509Req() - self.assertRaises(TypeError, request.get_subject, None) - - - def test_add_extensions(self): - """ - :py:obj:`X509Req.add_extensions` accepts a :py:obj:`list` of :py:obj:`X509Extension` - instances and adds them to the X509 request. - """ - request = X509Req() - request.add_extensions([ - X509Extension(b('basicConstraints'), True, b('CA:false'))]) - # XXX Add get_extensions so the rest of this unit test can be written. - - - def test_add_extensions_wrong_args(self): - """ - :py:obj:`X509Req.add_extensions` raises :py:obj:`TypeError` if called with the wrong - number of arguments or with a non-:py:obj:`list`. Or it raises :py:obj:`ValueError` - if called with a :py:obj:`list` containing objects other than :py:obj:`X509Extension` - instances. - """ - request = X509Req() - self.assertRaises(TypeError, request.add_extensions) - self.assertRaises(TypeError, request.add_extensions, object()) - self.assertRaises(ValueError, request.add_extensions, [object()]) - self.assertRaises(TypeError, request.add_extensions, [], None) - - - def test_verify_wrong_args(self): - """ - :py:obj:`X509Req.verify` raises :py:obj:`TypeError` if called with zero - arguments or more than one argument or if passed anything other than a - :py:obj:`PKey` instance as its single argument. - """ - request = X509Req() - self.assertRaises(TypeError, request.verify) - self.assertRaises(TypeError, request.verify, object()) - self.assertRaises(TypeError, request.verify, PKey(), object()) - - - def test_verify_uninitialized_key(self): - """ - :py:obj:`X509Req.verify` raises :py:obj:`OpenSSL.crypto.Error` if called - with a :py:obj:`OpenSSL.crypto.PKey` which contains no key data. - """ - request = X509Req() - pkey = PKey() - self.assertRaises(Error, request.verify, pkey) - - - def test_verify_wrong_key(self): - """ - :py:obj:`X509Req.verify` raises :py:obj:`OpenSSL.crypto.Error` if called - with a :py:obj:`OpenSSL.crypto.PKey` which does not represent the public - part of the key which signed the request. - """ - request = X509Req() - pkey = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - request.sign(pkey, GOOD_DIGEST) - another_pkey = load_privatekey(FILETYPE_PEM, client_key_pem) - self.assertRaises(Error, request.verify, another_pkey) - - - def test_verify_success(self): - """ - :py:obj:`X509Req.verify` returns :py:obj:`True` if called with a - :py:obj:`OpenSSL.crypto.PKey` which represents the public part ofthe key - which signed the request. - """ - request = X509Req() - pkey = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - request.sign(pkey, GOOD_DIGEST) - self.assertEqual(True, request.verify(pkey)) - - - -class X509Tests(TestCase, _PKeyInteractionTestsMixin): - """ - Tests for :py:obj:`OpenSSL.crypto.X509`. - """ - pemData = cleartextCertificatePEM + cleartextPrivateKeyPEM - - extpem = """ ------BEGIN CERTIFICATE----- -MIIC3jCCAkegAwIBAgIJAJHFjlcCgnQzMA0GCSqGSIb3DQEBBQUAMEcxCzAJBgNV -BAYTAlNFMRUwEwYDVQQIEwxXZXN0ZXJib3R0b20xEjAQBgNVBAoTCUNhdGFsb2dp -eDENMAsGA1UEAxMEUm9vdDAeFw0wODA0MjIxNDQ1MzhaFw0wOTA0MjIxNDQ1Mzha -MFQxCzAJBgNVBAYTAlNFMQswCQYDVQQIEwJXQjEUMBIGA1UEChMLT3Blbk1ldGFk -aXIxIjAgBgNVBAMTGW5vZGUxLm9tMi5vcGVubWV0YWRpci5vcmcwgZ8wDQYJKoZI -hvcNAQEBBQADgY0AMIGJAoGBAPIcQMrwbk2nESF/0JKibj9i1x95XYAOwP+LarwT -Op4EQbdlI9SY+uqYqlERhF19w7CS+S6oyqx0DRZSk4Y9dZ9j9/xgm2u/f136YS1u -zgYFPvfUs6PqYLPSM8Bw+SjJ+7+2+TN+Tkiof9WP1cMjodQwOmdsiRbR0/J7+b1B -hec1AgMBAAGjgcQwgcEwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNT -TCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFIdHsBcMVVMbAO7j6NCj -03HgLnHaMB8GA1UdIwQYMBaAFL2h9Bf9Mre4vTdOiHTGAt7BRY/8MEYGA1UdEQQ/ -MD2CDSouZXhhbXBsZS5vcmeCESoub20yLmV4bWFwbGUuY29thwSC7wgKgRNvbTJA -b3Blbm1ldGFkaXIub3JnMA0GCSqGSIb3DQEBBQUAA4GBALd7WdXkp2KvZ7/PuWZA -MPlIxyjS+Ly11+BNE0xGQRp9Wz+2lABtpgNqssvU156+HkKd02rGheb2tj7MX9hG -uZzbwDAZzJPjzDQDD7d3cWsrVcfIdqVU7epHqIadnOF+X0ghJ39pAm6VVadnSXCt -WpOdIpB8KksUTCzV591Nr1wd ------END CERTIFICATE----- - """ - def signable(self): - """ - Create and return a new :py:obj:`X509`. - """ - return X509() - - - def test_type(self): - """ - :py:obj:`X509` and :py:obj:`X509Type` refer to the same type object and can be used - to create instances of that type. - """ - self.assertIdentical(X509, X509Type) - self.assertConsistentType(X509, 'X509') - - - def test_construction(self): - """ - :py:obj:`X509` takes no arguments and returns an instance of :py:obj:`X509Type`. - """ - certificate = X509() - self.assertTrue( - isinstance(certificate, X509Type), - "%r is of type %r, should be %r" % (certificate, - type(certificate), - X509Type)) - self.assertEqual(type(X509Type).__name__, 'type') - self.assertEqual(type(certificate).__name__, 'X509') - self.assertEqual(type(certificate), X509Type) - self.assertEqual(type(certificate), X509) - - - def test_get_version_wrong_args(self): - """ - :py:obj:`X509.get_version` raises :py:obj:`TypeError` if invoked with any arguments. - """ - cert = X509() - self.assertRaises(TypeError, cert.get_version, None) - - - def test_set_version_wrong_args(self): - """ - :py:obj:`X509.set_version` raises :py:obj:`TypeError` if invoked with the wrong number - of arguments or an argument not of type :py:obj:`int`. - """ - cert = X509() - self.assertRaises(TypeError, cert.set_version) - self.assertRaises(TypeError, cert.set_version, None) - self.assertRaises(TypeError, cert.set_version, 1, None) - - - def test_version(self): - """ - :py:obj:`X509.set_version` sets the certificate version number. - :py:obj:`X509.get_version` retrieves it. - """ - cert = X509() - cert.set_version(1234) - self.assertEquals(cert.get_version(), 1234) - - - def test_get_serial_number_wrong_args(self): - """ - :py:obj:`X509.get_serial_number` raises :py:obj:`TypeError` if invoked with any - arguments. - """ - cert = X509() - self.assertRaises(TypeError, cert.get_serial_number, None) - - - def test_serial_number(self): - """ - The serial number of an :py:obj:`X509Type` can be retrieved and modified with - :py:obj:`X509Type.get_serial_number` and :py:obj:`X509Type.set_serial_number`. - """ - certificate = X509() - self.assertRaises(TypeError, certificate.set_serial_number) - self.assertRaises(TypeError, certificate.set_serial_number, 1, 2) - self.assertRaises(TypeError, certificate.set_serial_number, "1") - self.assertRaises(TypeError, certificate.set_serial_number, 5.5) - self.assertEqual(certificate.get_serial_number(), 0) - certificate.set_serial_number(1) - self.assertEqual(certificate.get_serial_number(), 1) - certificate.set_serial_number(2 ** 32 + 1) - self.assertEqual(certificate.get_serial_number(), 2 ** 32 + 1) - certificate.set_serial_number(2 ** 64 + 1) - self.assertEqual(certificate.get_serial_number(), 2 ** 64 + 1) - certificate.set_serial_number(2 ** 128 + 1) - self.assertEqual(certificate.get_serial_number(), 2 ** 128 + 1) - - - def _setBoundTest(self, which): - """ - :py:obj:`X509Type.set_notBefore` takes a string in the format of an ASN1 - GENERALIZEDTIME and sets the beginning of the certificate's validity - period to it. - """ - certificate = X509() - set = getattr(certificate, 'set_not' + which) - get = getattr(certificate, 'get_not' + which) - - # Starts with no value. - self.assertEqual(get(), None) - - # GMT (Or is it UTC?) -exarkun - when = b("20040203040506Z") - set(when) - self.assertEqual(get(), when) - - # A plus two hours and thirty minutes offset - when = b("20040203040506+0530") - set(when) - self.assertEqual(get(), when) - - # A minus one hour fifteen minutes offset - when = b("20040203040506-0115") - set(when) - self.assertEqual(get(), when) - - # An invalid string results in a ValueError - self.assertRaises(ValueError, set, b("foo bar")) - - # The wrong number of arguments results in a TypeError. - self.assertRaises(TypeError, set) - self.assertRaises(TypeError, set, b("20040203040506Z"), b("20040203040506Z")) - self.assertRaises(TypeError, get, b("foo bar")) - - - # XXX ASN1_TIME (not GENERALIZEDTIME) - - def test_set_notBefore(self): - """ - :py:obj:`X509Type.set_notBefore` takes a string in the format of an ASN1 - GENERALIZEDTIME and sets the beginning of the certificate's validity - period to it. - """ - self._setBoundTest("Before") - - - def test_set_notAfter(self): - """ - :py:obj:`X509Type.set_notAfter` takes a string in the format of an ASN1 - GENERALIZEDTIME and sets the end of the certificate's validity period - to it. - """ - self._setBoundTest("After") - - - def test_get_notBefore(self): - """ - :py:obj:`X509Type.get_notBefore` returns a string in the format of an ASN1 - GENERALIZEDTIME even for certificates which store it as UTCTIME - internally. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - self.assertEqual(cert.get_notBefore(), b("20090325123658Z")) - - - def test_get_notAfter(self): - """ - :py:obj:`X509Type.get_notAfter` returns a string in the format of an ASN1 - GENERALIZEDTIME even for certificates which store it as UTCTIME - internally. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - self.assertEqual(cert.get_notAfter(), b("20170611123658Z")) - - - def test_gmtime_adj_notBefore_wrong_args(self): - """ - :py:obj:`X509Type.gmtime_adj_notBefore` raises :py:obj:`TypeError` if called with the - wrong number of arguments or a non-:py:obj:`int` argument. - """ - cert = X509() - self.assertRaises(TypeError, cert.gmtime_adj_notBefore) - self.assertRaises(TypeError, cert.gmtime_adj_notBefore, None) - self.assertRaises(TypeError, cert.gmtime_adj_notBefore, 123, None) - - - def test_gmtime_adj_notBefore(self): - """ - :py:obj:`X509Type.gmtime_adj_notBefore` changes the not-before timestamp to be - the current time plus the number of seconds passed in. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - now = datetime.utcnow() + timedelta(seconds=100) - cert.gmtime_adj_notBefore(100) - self.assertEqual(cert.get_notBefore(), b(now.strftime("%Y%m%d%H%M%SZ"))) - - - def test_gmtime_adj_notAfter_wrong_args(self): - """ - :py:obj:`X509Type.gmtime_adj_notAfter` raises :py:obj:`TypeError` if called with the - wrong number of arguments or a non-:py:obj:`int` argument. - """ - cert = X509() - self.assertRaises(TypeError, cert.gmtime_adj_notAfter) - self.assertRaises(TypeError, cert.gmtime_adj_notAfter, None) - self.assertRaises(TypeError, cert.gmtime_adj_notAfter, 123, None) - - - def test_gmtime_adj_notAfter(self): - """ - :py:obj:`X509Type.gmtime_adj_notAfter` changes the not-after timestamp to be - the current time plus the number of seconds passed in. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - now = datetime.utcnow() + timedelta(seconds=100) - cert.gmtime_adj_notAfter(100) - self.assertEqual(cert.get_notAfter(), b(now.strftime("%Y%m%d%H%M%SZ"))) - - - def test_has_expired_wrong_args(self): - """ - :py:obj:`X509Type.has_expired` raises :py:obj:`TypeError` if called with any - arguments. - """ - cert = X509() - self.assertRaises(TypeError, cert.has_expired, None) - - - def test_has_expired(self): - """ - :py:obj:`X509Type.has_expired` returns :py:obj:`True` if the certificate's not-after - time is in the past. - """ - cert = X509() - cert.gmtime_adj_notAfter(-1) - self.assertTrue(cert.has_expired()) - - - def test_has_not_expired(self): - """ - :py:obj:`X509Type.has_expired` returns :py:obj:`False` if the certificate's not-after - time is in the future. - """ - cert = X509() - cert.gmtime_adj_notAfter(2) - self.assertFalse(cert.has_expired()) - - - def test_digest(self): - """ - :py:obj:`X509.digest` returns a string giving ":"-separated hex-encoded words - of the digest of the certificate. - """ - cert = X509() - self.assertEqual( - # This is MD5 instead of GOOD_DIGEST because the digest algorithm - # actually matters to the assertion (ie, another arbitrary, good - # digest will not product the same digest). - cert.digest("MD5"), - b("A8:EB:07:F8:53:25:0A:F2:56:05:C5:A5:C4:C4:C7:15")) - - - def _extcert(self, pkey, extensions): - cert = X509() - cert.set_pubkey(pkey) - cert.get_subject().commonName = "Unit Tests" - cert.get_issuer().commonName = "Unit Tests" - when = b(datetime.now().strftime("%Y%m%d%H%M%SZ")) - cert.set_notBefore(when) - cert.set_notAfter(when) - - cert.add_extensions(extensions) - return load_certificate( - FILETYPE_PEM, dump_certificate(FILETYPE_PEM, cert)) - - - def test_extension_count(self): - """ - :py:obj:`X509.get_extension_count` returns the number of extensions that are - present in the certificate. - """ - pkey = load_privatekey(FILETYPE_PEM, client_key_pem) - ca = X509Extension(b('basicConstraints'), True, b('CA:FALSE')) - key = X509Extension(b('keyUsage'), True, b('digitalSignature')) - subjectAltName = X509Extension( - b('subjectAltName'), True, b('DNS:example.com')) - - # Try a certificate with no extensions at all. - c = self._extcert(pkey, []) - self.assertEqual(c.get_extension_count(), 0) - - # And a certificate with one - c = self._extcert(pkey, [ca]) - self.assertEqual(c.get_extension_count(), 1) - - # And a certificate with several - c = self._extcert(pkey, [ca, key, subjectAltName]) - self.assertEqual(c.get_extension_count(), 3) - - - def test_get_extension(self): - """ - :py:obj:`X509.get_extension` takes an integer and returns an :py:obj:`X509Extension` - corresponding to the extension at that index. - """ - pkey = load_privatekey(FILETYPE_PEM, client_key_pem) - ca = X509Extension(b('basicConstraints'), True, b('CA:FALSE')) - key = X509Extension(b('keyUsage'), True, b('digitalSignature')) - subjectAltName = X509Extension( - b('subjectAltName'), False, b('DNS:example.com')) - - cert = self._extcert(pkey, [ca, key, subjectAltName]) - - ext = cert.get_extension(0) - self.assertTrue(isinstance(ext, X509Extension)) - self.assertTrue(ext.get_critical()) - self.assertEqual(ext.get_short_name(), b('basicConstraints')) - - ext = cert.get_extension(1) - self.assertTrue(isinstance(ext, X509Extension)) - self.assertTrue(ext.get_critical()) - self.assertEqual(ext.get_short_name(), b('keyUsage')) - - ext = cert.get_extension(2) - self.assertTrue(isinstance(ext, X509Extension)) - self.assertFalse(ext.get_critical()) - self.assertEqual(ext.get_short_name(), b('subjectAltName')) - - self.assertRaises(IndexError, cert.get_extension, -1) - self.assertRaises(IndexError, cert.get_extension, 4) - self.assertRaises(TypeError, cert.get_extension, "hello") - - - def test_nullbyte_subjectAltName(self): - """ - The fields of a `subjectAltName` extension on an X509 may contain NUL - bytes and this value is reflected in the string representation of the - extension object. - """ - cert = load_certificate(FILETYPE_PEM, nulbyteSubjectAltNamePEM) - - ext = cert.get_extension(3) - self.assertEqual(ext.get_short_name(), b('subjectAltName')) - self.assertEqual( - b("DNS:altnull.python.org\x00example.com, " - "email:null@python.org\x00user@example.org, " - "URI:http://null.python.org\x00http://example.org, " - "IP Address:192.0.2.1, IP Address:2001:DB8:0:0:0:0:0:1\n"), - b(str(ext))) - - - def test_invalid_digest_algorithm(self): - """ - :py:obj:`X509.digest` raises :py:obj:`ValueError` if called with an unrecognized hash - algorithm. - """ - cert = X509() - self.assertRaises(ValueError, cert.digest, BAD_DIGEST) - - - def test_get_subject_wrong_args(self): - """ - :py:obj:`X509.get_subject` raises :py:obj:`TypeError` if called with any arguments. - """ - cert = X509() - self.assertRaises(TypeError, cert.get_subject, None) - - - def test_get_subject(self): - """ - :py:obj:`X509.get_subject` returns an :py:obj:`X509Name` instance. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - subj = cert.get_subject() - self.assertTrue(isinstance(subj, X509Name)) - self.assertEquals( - subj.get_components(), - [(b('C'), b('US')), (b('ST'), b('IL')), (b('L'), b('Chicago')), - (b('O'), b('Testing')), (b('CN'), b('Testing Root CA'))]) - - - def test_set_subject_wrong_args(self): - """ - :py:obj:`X509.set_subject` raises a :py:obj:`TypeError` if called with the wrong - number of arguments or an argument not of type :py:obj:`X509Name`. - """ - cert = X509() - self.assertRaises(TypeError, cert.set_subject) - self.assertRaises(TypeError, cert.set_subject, None) - self.assertRaises(TypeError, cert.set_subject, cert.get_subject(), None) - - - def test_set_subject(self): - """ - :py:obj:`X509.set_subject` changes the subject of the certificate to the one - passed in. - """ - cert = X509() - name = cert.get_subject() - name.C = 'AU' - name.O = 'Unit Tests' - cert.set_subject(name) - self.assertEquals( - cert.get_subject().get_components(), - [(b('C'), b('AU')), (b('O'), b('Unit Tests'))]) - - - def test_get_issuer_wrong_args(self): - """ - :py:obj:`X509.get_issuer` raises :py:obj:`TypeError` if called with any arguments. - """ - cert = X509() - self.assertRaises(TypeError, cert.get_issuer, None) - - - def test_get_issuer(self): - """ - :py:obj:`X509.get_issuer` returns an :py:obj:`X509Name` instance. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - subj = cert.get_issuer() - self.assertTrue(isinstance(subj, X509Name)) - comp = subj.get_components() - self.assertEquals( - comp, - [(b('C'), b('US')), (b('ST'), b('IL')), (b('L'), b('Chicago')), - (b('O'), b('Testing')), (b('CN'), b('Testing Root CA'))]) - - - def test_set_issuer_wrong_args(self): - """ - :py:obj:`X509.set_issuer` raises a :py:obj:`TypeError` if called with the wrong - number of arguments or an argument not of type :py:obj:`X509Name`. - """ - cert = X509() - self.assertRaises(TypeError, cert.set_issuer) - self.assertRaises(TypeError, cert.set_issuer, None) - self.assertRaises(TypeError, cert.set_issuer, cert.get_issuer(), None) - - - def test_set_issuer(self): - """ - :py:obj:`X509.set_issuer` changes the issuer of the certificate to the one - passed in. - """ - cert = X509() - name = cert.get_issuer() - name.C = 'AU' - name.O = 'Unit Tests' - cert.set_issuer(name) - self.assertEquals( - cert.get_issuer().get_components(), - [(b('C'), b('AU')), (b('O'), b('Unit Tests'))]) - - - def test_get_pubkey_uninitialized(self): - """ - When called on a certificate with no public key, :py:obj:`X509.get_pubkey` - raises :py:obj:`OpenSSL.crypto.Error`. - """ - cert = X509() - self.assertRaises(Error, cert.get_pubkey) - - - def test_subject_name_hash_wrong_args(self): - """ - :py:obj:`X509.subject_name_hash` raises :py:obj:`TypeError` if called with any - arguments. - """ - cert = X509() - self.assertRaises(TypeError, cert.subject_name_hash, None) - - - def test_subject_name_hash(self): - """ - :py:obj:`X509.subject_name_hash` returns the hash of the certificate's subject - name. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - self.assertIn( - cert.subject_name_hash(), - [3350047874, # OpenSSL 0.9.8, MD5 - 3278919224, # OpenSSL 1.0.0, SHA1 - ]) - - - def test_get_signature_algorithm(self): - """ - :py:obj:`X509Type.get_signature_algorithm` returns a string which means - the algorithm used to sign the certificate. - """ - cert = load_certificate(FILETYPE_PEM, self.pemData) - self.assertEqual( - b("sha1WithRSAEncryption"), cert.get_signature_algorithm()) - - - def test_get_undefined_signature_algorithm(self): - """ - :py:obj:`X509Type.get_signature_algorithm` raises :py:obj:`ValueError` if the - signature algorithm is undefined or unknown. - """ - # This certificate has been modified to indicate a bogus OID in the - # signature algorithm field so that OpenSSL does not recognize it. - certPEM = b("""\ ------BEGIN CERTIFICATE----- -MIIC/zCCAmigAwIBAgIBATAGBgJ8BQUAMHsxCzAJBgNVBAYTAlNHMREwDwYDVQQK -EwhNMkNyeXB0bzEUMBIGA1UECxMLTTJDcnlwdG8gQ0ExJDAiBgNVBAMTG00yQ3J5 -cHRvIENlcnRpZmljYXRlIE1hc3RlcjEdMBsGCSqGSIb3DQEJARYObmdwc0Bwb3N0 -MS5jb20wHhcNMDAwOTEwMDk1MTMwWhcNMDIwOTEwMDk1MTMwWjBTMQswCQYDVQQG -EwJTRzERMA8GA1UEChMITTJDcnlwdG8xEjAQBgNVBAMTCWxvY2FsaG9zdDEdMBsG -CSqGSIb3DQEJARYObmdwc0Bwb3N0MS5jb20wXDANBgkqhkiG9w0BAQEFAANLADBI -AkEArL57d26W9fNXvOhNlZzlPOACmvwOZ5AdNgLzJ1/MfsQQJ7hHVeHmTAjM664V -+fXvwUGJLziCeBo1ysWLRnl8CQIDAQABo4IBBDCCAQAwCQYDVR0TBAIwADAsBglg -hkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0O -BBYEFM+EgpK+eyZiwFU1aOPSbczbPSpVMIGlBgNVHSMEgZ0wgZqAFPuHI2nrnDqT -FeXFvylRT/7tKDgBoX+kfTB7MQswCQYDVQQGEwJTRzERMA8GA1UEChMITTJDcnlw -dG8xFDASBgNVBAsTC00yQ3J5cHRvIENBMSQwIgYDVQQDExtNMkNyeXB0byBDZXJ0 -aWZpY2F0ZSBNYXN0ZXIxHTAbBgkqhkiG9w0BCQEWDm5ncHNAcG9zdDEuY29tggEA -MA0GCSqGSIb3DQEBBAUAA4GBADv8KpPo+gfJxN2ERK1Y1l17sz/ZhzoGgm5XCdbx -jEY7xKfpQngV599k1xhl11IMqizDwu0855agrckg2MCTmOI9DZzDD77tAYb+Dk0O -PEVk0Mk/V0aIsDE9bolfCi/i/QWZ3N8s5nTWMNyBBBmoSliWCm4jkkRZRD0ejgTN -tgI5 ------END CERTIFICATE----- -""") - cert = load_certificate(FILETYPE_PEM, certPEM) - self.assertRaises(ValueError, cert.get_signature_algorithm) - - - -class X509StoreTests(TestCase): - """ - Test for :py:obj:`OpenSSL.crypto.X509Store`. - """ - def test_type(self): - """ - :py:obj:`X509StoreType` is a type object. - """ - self.assertIdentical(X509Store, X509StoreType) - self.assertConsistentType(X509Store, 'X509Store') - - - def test_add_cert_wrong_args(self): - store = X509Store() - self.assertRaises(TypeError, store.add_cert) - self.assertRaises(TypeError, store.add_cert, object()) - self.assertRaises(TypeError, store.add_cert, X509(), object()) - - - def test_add_cert(self): - """ - :py:obj:`X509Store.add_cert` adds a :py:obj:`X509` instance to the - certificate store. - """ - cert = load_certificate(FILETYPE_PEM, cleartextCertificatePEM) - store = X509Store() - store.add_cert(cert) - - - def test_add_cert_rejects_duplicate(self): - """ - :py:obj:`X509Store.add_cert` raises :py:obj:`OpenSSL.crypto.Error` if an - attempt is made to add the same certificate to the store more than once. - """ - cert = load_certificate(FILETYPE_PEM, cleartextCertificatePEM) - store = X509Store() - store.add_cert(cert) - self.assertRaises(Error, store.add_cert, cert) - - - -class PKCS12Tests(TestCase): - """ - Test for :py:obj:`OpenSSL.crypto.PKCS12` and :py:obj:`OpenSSL.crypto.load_pkcs12`. - """ - pemData = cleartextCertificatePEM + cleartextPrivateKeyPEM - - def test_type(self): - """ - :py:obj:`PKCS12Type` is a type object. - """ - self.assertIdentical(PKCS12, PKCS12Type) - self.assertConsistentType(PKCS12, 'PKCS12') - - - def test_empty_construction(self): - """ - :py:obj:`PKCS12` returns a new instance of :py:obj:`PKCS12` with no certificate, - private key, CA certificates, or friendly name. - """ - p12 = PKCS12() - self.assertEqual(None, p12.get_certificate()) - self.assertEqual(None, p12.get_privatekey()) - self.assertEqual(None, p12.get_ca_certificates()) - self.assertEqual(None, p12.get_friendlyname()) - - - def test_type_errors(self): - """ - The :py:obj:`PKCS12` setter functions (:py:obj:`set_certificate`, :py:obj:`set_privatekey`, - :py:obj:`set_ca_certificates`, and :py:obj:`set_friendlyname`) raise :py:obj:`TypeError` - when passed objects of types other than those expected. - """ - p12 = PKCS12() - self.assertRaises(TypeError, p12.set_certificate, 3) - self.assertRaises(TypeError, p12.set_certificate, PKey()) - self.assertRaises(TypeError, p12.set_certificate, X509) - self.assertRaises(TypeError, p12.set_privatekey, 3) - self.assertRaises(TypeError, p12.set_privatekey, 'legbone') - self.assertRaises(TypeError, p12.set_privatekey, X509()) - self.assertRaises(TypeError, p12.set_ca_certificates, 3) - self.assertRaises(TypeError, p12.set_ca_certificates, X509()) - self.assertRaises(TypeError, p12.set_ca_certificates, (3, 4)) - self.assertRaises(TypeError, p12.set_ca_certificates, ( PKey(), )) - self.assertRaises(TypeError, p12.set_friendlyname, 6) - self.assertRaises(TypeError, p12.set_friendlyname, ('foo', 'bar')) - - - def test_key_only(self): - """ - A :py:obj:`PKCS12` with only a private key can be exported using - :py:obj:`PKCS12.export` and loaded again using :py:obj:`load_pkcs12`. - """ - passwd = b"blah" - p12 = PKCS12() - pkey = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - p12.set_privatekey(pkey) - self.assertEqual(None, p12.get_certificate()) - self.assertEqual(pkey, p12.get_privatekey()) - try: - dumped_p12 = p12.export(passphrase=passwd, iter=2, maciter=3) - except Error: - # Some versions of OpenSSL will throw an exception - # for this nearly useless PKCS12 we tried to generate: - # [('PKCS12 routines', 'PKCS12_create', 'invalid null argument')] - return - p12 = load_pkcs12(dumped_p12, passwd) - self.assertEqual(None, p12.get_ca_certificates()) - self.assertEqual(None, p12.get_certificate()) - - # OpenSSL fails to bring the key back to us. So sad. Perhaps in the - # future this will be improved. - self.assertTrue(isinstance(p12.get_privatekey(), (PKey, type(None)))) - - - def test_cert_only(self): - """ - A :py:obj:`PKCS12` with only a certificate can be exported using - :py:obj:`PKCS12.export` and loaded again using :py:obj:`load_pkcs12`. - """ - passwd = b"blah" - p12 = PKCS12() - cert = load_certificate(FILETYPE_PEM, cleartextCertificatePEM) - p12.set_certificate(cert) - self.assertEqual(cert, p12.get_certificate()) - self.assertEqual(None, p12.get_privatekey()) - try: - dumped_p12 = p12.export(passphrase=passwd, iter=2, maciter=3) - except Error: - # Some versions of OpenSSL will throw an exception - # for this nearly useless PKCS12 we tried to generate: - # [('PKCS12 routines', 'PKCS12_create', 'invalid null argument')] - return - p12 = load_pkcs12(dumped_p12, passwd) - self.assertEqual(None, p12.get_privatekey()) - - # OpenSSL fails to bring the cert back to us. Groany mcgroan. - self.assertTrue(isinstance(p12.get_certificate(), (X509, type(None)))) - - # Oh ho. It puts the certificate into the ca certificates list, in - # fact. Totally bogus, I would think. Nevertheless, let's exploit - # that to check to see if it reconstructed the certificate we expected - # it to. At some point, hopefully this will change so that - # p12.get_certificate() is actually what returns the loaded - # certificate. - self.assertEqual( - cleartextCertificatePEM, - dump_certificate(FILETYPE_PEM, p12.get_ca_certificates()[0])) - - - def gen_pkcs12(self, cert_pem=None, key_pem=None, ca_pem=None, friendly_name=None): - """ - Generate a PKCS12 object with components from PEM. Verify that the set - functions return None. - """ - p12 = PKCS12() - if cert_pem: - ret = p12.set_certificate(load_certificate(FILETYPE_PEM, cert_pem)) - self.assertEqual(ret, None) - if key_pem: - ret = p12.set_privatekey(load_privatekey(FILETYPE_PEM, key_pem)) - self.assertEqual(ret, None) - if ca_pem: - ret = p12.set_ca_certificates((load_certificate(FILETYPE_PEM, ca_pem),)) - self.assertEqual(ret, None) - if friendly_name: - ret = p12.set_friendlyname(friendly_name) - self.assertEqual(ret, None) - return p12 - - - def check_recovery(self, p12_str, key=None, cert=None, ca=None, passwd=b"", - extra=()): - """ - Use openssl program to confirm three components are recoverable from a - PKCS12 string. - """ - if key: - recovered_key = _runopenssl( - p12_str, b"pkcs12", b"-nocerts", b"-nodes", b"-passin", - b"pass:" + passwd, *extra) - self.assertEqual(recovered_key[-len(key):], key) - if cert: - recovered_cert = _runopenssl( - p12_str, b"pkcs12", b"-clcerts", b"-nodes", b"-passin", - b"pass:" + passwd, b"-nokeys", *extra) - self.assertEqual(recovered_cert[-len(cert):], cert) - if ca: - recovered_cert = _runopenssl( - p12_str, b"pkcs12", b"-cacerts", b"-nodes", b"-passin", - b"pass:" + passwd, b"-nokeys", *extra) - self.assertEqual(recovered_cert[-len(ca):], ca) - - - def test_load_pkcs12(self): - """ - A PKCS12 string generated using the openssl command line can be loaded - with :py:obj:`load_pkcs12` and its components extracted and examined. - """ - passwd = b"whatever" - pem = client_key_pem + client_cert_pem - p12_str = _runopenssl( - pem, b"pkcs12", b"-export", b"-clcerts", b"-passout", b"pass:" + passwd) - p12 = load_pkcs12(p12_str, passwd) - # verify - self.assertTrue(isinstance(p12, PKCS12)) - cert_pem = dump_certificate(FILETYPE_PEM, p12.get_certificate()) - self.assertEqual(cert_pem, client_cert_pem) - key_pem = dump_privatekey(FILETYPE_PEM, p12.get_privatekey()) - self.assertEqual(key_pem, client_key_pem) - self.assertEqual(None, p12.get_ca_certificates()) - - - def test_load_pkcs12_garbage(self): - """ - :py:obj:`load_pkcs12` raises :py:obj:`OpenSSL.crypto.Error` when passed a string - which is not a PKCS12 dump. - """ - passwd = 'whatever' - e = self.assertRaises(Error, load_pkcs12, b'fruit loops', passwd) - self.assertEqual( e.args[0][0][0], 'asn1 encoding routines') - self.assertEqual( len(e.args[0][0]), 3) - - - def test_replace(self): - """ - :py:obj:`PKCS12.set_certificate` replaces the certificate in a PKCS12 cluster. - :py:obj:`PKCS12.set_privatekey` replaces the private key. - :py:obj:`PKCS12.set_ca_certificates` replaces the CA certificates. - """ - p12 = self.gen_pkcs12(client_cert_pem, client_key_pem, root_cert_pem) - p12.set_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - p12.set_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - root_cert = load_certificate(FILETYPE_PEM, root_cert_pem) - client_cert = load_certificate(FILETYPE_PEM, client_cert_pem) - p12.set_ca_certificates([root_cert]) # not a tuple - self.assertEqual(1, len(p12.get_ca_certificates())) - self.assertEqual(root_cert, p12.get_ca_certificates()[0]) - p12.set_ca_certificates([client_cert, root_cert]) - self.assertEqual(2, len(p12.get_ca_certificates())) - self.assertEqual(client_cert, p12.get_ca_certificates()[0]) - self.assertEqual(root_cert, p12.get_ca_certificates()[1]) - - - def test_friendly_name(self): - """ - The *friendlyName* of a PKCS12 can be set and retrieved via - :py:obj:`PKCS12.get_friendlyname` and :py:obj:`PKCS12_set_friendlyname`, and a - :py:obj:`PKCS12` with a friendly name set can be dumped with :py:obj:`PKCS12.export`. - """ - passwd = b'Dogmeat[]{}!@#$%^&*()~`?/.,<>-_+=";:' - p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) - for friendly_name in [b('Serverlicious'), None, b('###')]: - p12.set_friendlyname(friendly_name) - self.assertEqual(p12.get_friendlyname(), friendly_name) - dumped_p12 = p12.export(passphrase=passwd, iter=2, maciter=3) - reloaded_p12 = load_pkcs12(dumped_p12, passwd) - self.assertEqual( - p12.get_friendlyname(), reloaded_p12.get_friendlyname()) - # We would use the openssl program to confirm the friendly - # name, but it is not possible. The pkcs12 command - # does not store the friendly name in the cert's - # alias, which we could then extract. - self.check_recovery( - dumped_p12, key=server_key_pem, cert=server_cert_pem, - ca=root_cert_pem, passwd=passwd) - - - def test_various_empty_passphrases(self): - """ - Test that missing, None, and '' passphrases are identical for PKCS12 - export. - """ - p12 = self.gen_pkcs12(client_cert_pem, client_key_pem, root_cert_pem) - passwd = b"" - dumped_p12_empty = p12.export(iter=2, maciter=0, passphrase=passwd) - dumped_p12_none = p12.export(iter=3, maciter=2, passphrase=None) - dumped_p12_nopw = p12.export(iter=9, maciter=4) - for dumped_p12 in [dumped_p12_empty, dumped_p12_none, dumped_p12_nopw]: - self.check_recovery( - dumped_p12, key=client_key_pem, cert=client_cert_pem, - ca=root_cert_pem, passwd=passwd) - - - def test_removing_ca_cert(self): - """ - Passing :py:obj:`None` to :py:obj:`PKCS12.set_ca_certificates` removes all CA - certificates. - """ - p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) - p12.set_ca_certificates(None) - self.assertEqual(None, p12.get_ca_certificates()) - - - def test_export_without_mac(self): - """ - Exporting a PKCS12 with a :py:obj:`maciter` of ``-1`` excludes the MAC - entirely. - """ - passwd = b"Lake Michigan" - p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) - dumped_p12 = p12.export(maciter=-1, passphrase=passwd, iter=2) - self.check_recovery( - dumped_p12, key=server_key_pem, cert=server_cert_pem, - passwd=passwd, extra=(b"-nomacver",)) - - - def test_load_without_mac(self): - """ - Loading a PKCS12 without a MAC does something other than crash. - """ - passwd = b"Lake Michigan" - p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) - dumped_p12 = p12.export(maciter=-1, passphrase=passwd, iter=2) - try: - recovered_p12 = load_pkcs12(dumped_p12, passwd) - # The person who generated this PCKS12 should be flogged, - # or better yet we should have a means to determine - # whether a PCKS12 had a MAC that was verified. - # Anyway, libopenssl chooses to allow it, so the - # pyopenssl binding does as well. - self.assertTrue(isinstance(recovered_p12, PKCS12)) - except Error: - # Failing here with an exception is preferred as some openssl - # versions do. - pass - - - def test_zero_len_list_for_ca(self): - """ - A PKCS12 with an empty CA certificates list can be exported. - """ - passwd = 'Hobie 18' - p12 = self.gen_pkcs12(server_cert_pem, server_key_pem) - # p12.set_ca_certificates([]) - # self.assertEqual((), p12.get_ca_certificates()) - # dumped_p12 = p12.export(passphrase=passwd, iter=3) - # self.check_recovery( - # dumped_p12, key=server_key_pem, cert=server_cert_pem, - # passwd=passwd) - - - def test_export_without_args(self): - """ - All the arguments to :py:obj:`PKCS12.export` are optional. - """ - p12 = self.gen_pkcs12(server_cert_pem, server_key_pem, root_cert_pem) - dumped_p12 = p12.export() # no args - self.check_recovery( - dumped_p12, key=server_key_pem, cert=server_cert_pem, passwd=b"") - - - def test_key_cert_mismatch(self): - """ - :py:obj:`PKCS12.export` raises an exception when a key and certificate - mismatch. - """ - p12 = self.gen_pkcs12(server_cert_pem, client_key_pem, root_cert_pem) - self.assertRaises(Error, p12.export) - - - -# These quoting functions taken directly from Twisted's twisted.python.win32. -_cmdLineQuoteRe = re.compile(br'(\\*)"') -_cmdLineQuoteRe2 = re.compile(br'(\\+)\Z') -def cmdLineQuote(s): - """ - Internal method for quoting a single command-line argument. - - See http://www.perlmonks.org/?node_id=764004 - - :type: :py:obj:`str` - :param s: A single unquoted string to quote for something that is expecting - cmd.exe-style quoting - - :rtype: :py:obj:`str` - :return: A cmd.exe-style quoted string - """ - s = _cmdLineQuoteRe2.sub(br"\1\1", _cmdLineQuoteRe.sub(br'\1\1\\"', s)) - return b'"' + s + b'"' - - - -def quoteArguments(arguments): - """ - Quote an iterable of command-line arguments for passing to CreateProcess or - a similar API. This allows the list passed to :py:obj:`reactor.spawnProcess` to - match the child process's :py:obj:`sys.argv` properly. - - :type arguments: :py:obj:`iterable` of :py:obj:`str` - :param arguments: An iterable of unquoted arguments to quote - - :rtype: :py:obj:`str` - :return: A space-delimited string containing quoted versions of :py:obj:`arguments` - """ - return b' '.join(map(cmdLineQuote, arguments)) - - - -def _runopenssl(pem, *args): - """ - Run the command line openssl tool with the given arguments and write - the given PEM to its stdin. Not safe for quotes. - """ - if os.name == 'posix': - command = b"openssl " + b" ".join([ - (b"'" + arg.replace(b"'", b"'\\''") + b"'") - for arg in args]) - else: - command = b"openssl " + quoteArguments(args) - proc = Popen(native(command), shell=True, stdin=PIPE, stdout=PIPE) - proc.stdin.write(pem) - proc.stdin.close() - output = proc.stdout.read() - proc.stdout.close() - proc.wait() - return output - - - -class FunctionTests(TestCase): - """ - Tests for free-functions in the :py:obj:`OpenSSL.crypto` module. - """ - - def test_load_privatekey_invalid_format(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`ValueError` if passed an unknown filetype. - """ - self.assertRaises(ValueError, load_privatekey, 100, root_key_pem) - - - def test_load_privatekey_invalid_passphrase_type(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`TypeError` if passed a passphrase that is - neither a :py:obj:`str` nor a callable. - """ - self.assertRaises( - TypeError, - load_privatekey, - FILETYPE_PEM, encryptedPrivateKeyPEMPassphrase, object()) - - - def test_load_privatekey_wrong_args(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`TypeError` if called with the wrong number - of arguments. - """ - self.assertRaises(TypeError, load_privatekey) - - - def test_load_privatekey_wrongPassphrase(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`OpenSSL.crypto.Error` when it is passed an - encrypted PEM and an incorrect passphrase. - """ - self.assertRaises( - Error, - load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, b("quack")) - - - def test_load_privatekey_passphraseWrongType(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`ValueError` when it is passed a passphrase - with a private key encoded in a format, that doesn't support - encryption. - """ - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - blob = dump_privatekey(FILETYPE_ASN1, key) - self.assertRaises(ValueError, - load_privatekey, FILETYPE_ASN1, blob, "secret") - - - def test_load_privatekey_passphrase(self): - """ - :py:obj:`load_privatekey` can create a :py:obj:`PKey` object from an encrypted PEM - string if given the passphrase. - """ - key = load_privatekey( - FILETYPE_PEM, encryptedPrivateKeyPEM, - encryptedPrivateKeyPEMPassphrase) - self.assertTrue(isinstance(key, PKeyType)) - - - def test_load_privatekey_passphrase_exception(self): - """ - If the passphrase callback raises an exception, that exception is raised - by :py:obj:`load_privatekey`. - """ - def cb(ignored): - raise ArithmeticError - - self.assertRaises(ArithmeticError, - load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, cb) - - - def test_load_privatekey_wrongPassphraseCallback(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`OpenSSL.crypto.Error` when it - is passed an encrypted PEM and a passphrase callback which returns an - incorrect passphrase. - """ - called = [] - def cb(*a): - called.append(None) - return b("quack") - self.assertRaises( - Error, - load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, cb) - self.assertTrue(called) - - - def test_load_privatekey_passphraseCallback(self): - """ - :py:obj:`load_privatekey` can create a :py:obj:`PKey` object from an encrypted PEM - string if given a passphrase callback which returns the correct - password. - """ - called = [] - def cb(writing): - called.append(writing) - return encryptedPrivateKeyPEMPassphrase - key = load_privatekey(FILETYPE_PEM, encryptedPrivateKeyPEM, cb) - self.assertTrue(isinstance(key, PKeyType)) - self.assertEqual(called, [False]) - - - def test_load_privatekey_passphrase_wrong_return_type(self): - """ - :py:obj:`load_privatekey` raises :py:obj:`ValueError` if the passphrase - callback returns something other than a byte string. - """ - self.assertRaises( - ValueError, - load_privatekey, - FILETYPE_PEM, encryptedPrivateKeyPEM, lambda *args: 3) - - - def test_dump_privatekey_wrong_args(self): - """ - :py:obj:`dump_privatekey` raises :py:obj:`TypeError` if called with the wrong number - of arguments. - """ - self.assertRaises(TypeError, dump_privatekey) - # If cipher name is given, password is required. - self.assertRaises( - TypeError, dump_privatekey, FILETYPE_PEM, PKey(), GOOD_CIPHER) - - - def test_dump_privatekey_unknown_cipher(self): - """ - :py:obj:`dump_privatekey` raises :py:obj:`ValueError` if called with an unrecognized - cipher name. - """ - key = PKey() - key.generate_key(TYPE_RSA, 512) - self.assertRaises( - ValueError, dump_privatekey, - FILETYPE_PEM, key, BAD_CIPHER, "passphrase") - - - def test_dump_privatekey_invalid_passphrase_type(self): - """ - :py:obj:`dump_privatekey` raises :py:obj:`TypeError` if called with a passphrase which - is neither a :py:obj:`str` nor a callable. - """ - key = PKey() - key.generate_key(TYPE_RSA, 512) - self.assertRaises( - TypeError, - dump_privatekey, FILETYPE_PEM, key, GOOD_CIPHER, object()) - - - def test_dump_privatekey_invalid_filetype(self): - """ - :py:obj:`dump_privatekey` raises :py:obj:`ValueError` if called with an unrecognized - filetype. - """ - key = PKey() - key.generate_key(TYPE_RSA, 512) - self.assertRaises(ValueError, dump_privatekey, 100, key) - - - def test_load_privatekey_passphraseCallbackLength(self): - """ - :py:obj:`crypto.load_privatekey` should raise an error when the passphrase - provided by the callback is too long, not silently truncate it. - """ - def cb(ignored): - return "a" * 1025 - - self.assertRaises(ValueError, - load_privatekey, FILETYPE_PEM, encryptedPrivateKeyPEM, cb) - - - def test_dump_privatekey_passphrase(self): - """ - :py:obj:`dump_privatekey` writes an encrypted PEM when given a passphrase. - """ - passphrase = b("foo") - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - pem = dump_privatekey(FILETYPE_PEM, key, GOOD_CIPHER, passphrase) - self.assertTrue(isinstance(pem, binary_type)) - loadedKey = load_privatekey(FILETYPE_PEM, pem, passphrase) - self.assertTrue(isinstance(loadedKey, PKeyType)) - self.assertEqual(loadedKey.type(), key.type()) - self.assertEqual(loadedKey.bits(), key.bits()) - - - def test_dump_privatekey_passphraseWrongType(self): - """ - :py:obj:`dump_privatekey` raises :py:obj:`ValueError` when it is passed a passphrase - with a private key encoded in a format, that doesn't support - encryption. - """ - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - self.assertRaises(ValueError, - dump_privatekey, FILETYPE_ASN1, key, GOOD_CIPHER, "secret") - - - def test_dump_certificate(self): - """ - :py:obj:`dump_certificate` writes PEM, DER, and text. - """ - pemData = cleartextCertificatePEM + cleartextPrivateKeyPEM - cert = load_certificate(FILETYPE_PEM, pemData) - dumped_pem = dump_certificate(FILETYPE_PEM, cert) - self.assertEqual(dumped_pem, cleartextCertificatePEM) - dumped_der = dump_certificate(FILETYPE_ASN1, cert) - good_der = _runopenssl(dumped_pem, b"x509", b"-outform", b"DER") - self.assertEqual(dumped_der, good_der) - cert2 = load_certificate(FILETYPE_ASN1, dumped_der) - dumped_pem2 = dump_certificate(FILETYPE_PEM, cert2) - self.assertEqual(dumped_pem2, cleartextCertificatePEM) - dumped_text = dump_certificate(FILETYPE_TEXT, cert) - good_text = _runopenssl(dumped_pem, b"x509", b"-noout", b"-text") - self.assertEqual(dumped_text, good_text) - - - def test_dump_privatekey_pem(self): - """ - :py:obj:`dump_privatekey` writes a PEM - """ - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - self.assertTrue(key.check()) - dumped_pem = dump_privatekey(FILETYPE_PEM, key) - self.assertEqual(dumped_pem, cleartextPrivateKeyPEM) - - - def test_dump_privatekey_asn1(self): - """ - :py:obj:`dump_privatekey` writes a DER - """ - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - dumped_pem = dump_privatekey(FILETYPE_PEM, key) - - dumped_der = dump_privatekey(FILETYPE_ASN1, key) - # XXX This OpenSSL call writes "writing RSA key" to standard out. Sad. - good_der = _runopenssl(dumped_pem, b"rsa", b"-outform", b"DER") - self.assertEqual(dumped_der, good_der) - key2 = load_privatekey(FILETYPE_ASN1, dumped_der) - dumped_pem2 = dump_privatekey(FILETYPE_PEM, key2) - self.assertEqual(dumped_pem2, cleartextPrivateKeyPEM) - - - def test_dump_privatekey_text(self): - """ - :py:obj:`dump_privatekey` writes a text - """ - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - dumped_pem = dump_privatekey(FILETYPE_PEM, key) - - dumped_text = dump_privatekey(FILETYPE_TEXT, key) - good_text = _runopenssl(dumped_pem, b"rsa", b"-noout", b"-text") - self.assertEqual(dumped_text, good_text) - - - def test_dump_certificate_request(self): - """ - :py:obj:`dump_certificate_request` writes a PEM, DER, and text. - """ - req = load_certificate_request(FILETYPE_PEM, cleartextCertificateRequestPEM) - dumped_pem = dump_certificate_request(FILETYPE_PEM, req) - self.assertEqual(dumped_pem, cleartextCertificateRequestPEM) - dumped_der = dump_certificate_request(FILETYPE_ASN1, req) - good_der = _runopenssl(dumped_pem, b"req", b"-outform", b"DER") - self.assertEqual(dumped_der, good_der) - req2 = load_certificate_request(FILETYPE_ASN1, dumped_der) - dumped_pem2 = dump_certificate_request(FILETYPE_PEM, req2) - self.assertEqual(dumped_pem2, cleartextCertificateRequestPEM) - dumped_text = dump_certificate_request(FILETYPE_TEXT, req) - good_text = _runopenssl(dumped_pem, b"req", b"-noout", b"-text") - self.assertEqual(dumped_text, good_text) - self.assertRaises(ValueError, dump_certificate_request, 100, req) - - - def test_dump_privatekey_passphraseCallback(self): - """ - :py:obj:`dump_privatekey` writes an encrypted PEM when given a callback which - returns the correct passphrase. - """ - passphrase = b("foo") - called = [] - def cb(writing): - called.append(writing) - return passphrase - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - pem = dump_privatekey(FILETYPE_PEM, key, GOOD_CIPHER, cb) - self.assertTrue(isinstance(pem, binary_type)) - self.assertEqual(called, [True]) - loadedKey = load_privatekey(FILETYPE_PEM, pem, passphrase) - self.assertTrue(isinstance(loadedKey, PKeyType)) - self.assertEqual(loadedKey.type(), key.type()) - self.assertEqual(loadedKey.bits(), key.bits()) - - - def test_dump_privatekey_passphrase_exception(self): - """ - :py:obj:`dump_privatekey` should not overwrite the exception raised - by the passphrase callback. - """ - def cb(ignored): - raise ArithmeticError - - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - self.assertRaises(ArithmeticError, - dump_privatekey, FILETYPE_PEM, key, GOOD_CIPHER, cb) - - - def test_dump_privatekey_passphraseCallbackLength(self): - """ - :py:obj:`crypto.dump_privatekey` should raise an error when the passphrase - provided by the callback is too long, not silently truncate it. - """ - def cb(ignored): - return "a" * 1025 - - key = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - self.assertRaises(ValueError, - dump_privatekey, FILETYPE_PEM, key, GOOD_CIPHER, cb) - - - def test_load_pkcs7_data(self): - """ - :py:obj:`load_pkcs7_data` accepts a PKCS#7 string and returns an instance of - :py:obj:`PKCS7Type`. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertTrue(isinstance(pkcs7, PKCS7Type)) - - - def test_load_pkcs7_data_invalid(self): - """ - If the data passed to :py:obj:`load_pkcs7_data` is invalid, - :py:obj:`Error` is raised. - """ - self.assertRaises(Error, load_pkcs7_data, FILETYPE_PEM, b"foo") - - - -class LoadCertificateTests(TestCase): - """ - Tests for :py:obj:`load_certificate_request`. - """ - def test_badFileType(self): - """ - If the file type passed to :py:obj:`load_certificate_request` is - neither :py:obj:`FILETYPE_PEM` nor :py:obj:`FILETYPE_ASN1` then - :py:class:`ValueError` is raised. - """ - self.assertRaises(ValueError, load_certificate_request, object(), b"") - - - -class PKCS7Tests(TestCase): - """ - Tests for :py:obj:`PKCS7Type`. - """ - def test_type(self): - """ - :py:obj:`PKCS7Type` is a type object. - """ - self.assertTrue(isinstance(PKCS7Type, type)) - self.assertEqual(PKCS7Type.__name__, 'PKCS7') - - # XXX This doesn't currently work. - # self.assertIdentical(PKCS7, PKCS7Type) - - - # XXX Opposite results for all these following methods - - def test_type_is_signed_wrong_args(self): - """ - :py:obj:`PKCS7Type.type_is_signed` raises :py:obj:`TypeError` if called with any - arguments. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertRaises(TypeError, pkcs7.type_is_signed, None) - - - def test_type_is_signed(self): - """ - :py:obj:`PKCS7Type.type_is_signed` returns :py:obj:`True` if the PKCS7 object is of - the type *signed*. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertTrue(pkcs7.type_is_signed()) - - - def test_type_is_enveloped_wrong_args(self): - """ - :py:obj:`PKCS7Type.type_is_enveloped` raises :py:obj:`TypeError` if called with any - arguments. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertRaises(TypeError, pkcs7.type_is_enveloped, None) - - - def test_type_is_enveloped(self): - """ - :py:obj:`PKCS7Type.type_is_enveloped` returns :py:obj:`False` if the PKCS7 object is - not of the type *enveloped*. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertFalse(pkcs7.type_is_enveloped()) - - - def test_type_is_signedAndEnveloped_wrong_args(self): - """ - :py:obj:`PKCS7Type.type_is_signedAndEnveloped` raises :py:obj:`TypeError` if called - with any arguments. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertRaises(TypeError, pkcs7.type_is_signedAndEnveloped, None) - - - def test_type_is_signedAndEnveloped(self): - """ - :py:obj:`PKCS7Type.type_is_signedAndEnveloped` returns :py:obj:`False` if the PKCS7 - object is not of the type *signed and enveloped*. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertFalse(pkcs7.type_is_signedAndEnveloped()) - - - def test_type_is_data(self): - """ - :py:obj:`PKCS7Type.type_is_data` returns :py:obj:`False` if the PKCS7 object is not of - the type data. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertFalse(pkcs7.type_is_data()) - - - def test_type_is_data_wrong_args(self): - """ - :py:obj:`PKCS7Type.type_is_data` raises :py:obj:`TypeError` if called with any - arguments. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertRaises(TypeError, pkcs7.type_is_data, None) - - - def test_get_type_name_wrong_args(self): - """ - :py:obj:`PKCS7Type.get_type_name` raises :py:obj:`TypeError` if called with any - arguments. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertRaises(TypeError, pkcs7.get_type_name, None) - - - def test_get_type_name(self): - """ - :py:obj:`PKCS7Type.get_type_name` returns a :py:obj:`str` giving the type name. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertEquals(pkcs7.get_type_name(), b('pkcs7-signedData')) - - - def test_attribute(self): - """ - If an attribute other than one of the methods tested here is accessed on - an instance of :py:obj:`PKCS7Type`, :py:obj:`AttributeError` is raised. - """ - pkcs7 = load_pkcs7_data(FILETYPE_PEM, pkcs7Data) - self.assertRaises(AttributeError, getattr, pkcs7, "foo") - - - -class NetscapeSPKITests(TestCase, _PKeyInteractionTestsMixin): - """ - Tests for :py:obj:`OpenSSL.crypto.NetscapeSPKI`. - """ - def signable(self): - """ - Return a new :py:obj:`NetscapeSPKI` for use with signing tests. - """ - return NetscapeSPKI() - - - def test_type(self): - """ - :py:obj:`NetscapeSPKI` and :py:obj:`NetscapeSPKIType` refer to the same type object - and can be used to create instances of that type. - """ - self.assertIdentical(NetscapeSPKI, NetscapeSPKIType) - self.assertConsistentType(NetscapeSPKI, 'NetscapeSPKI') - - - def test_construction(self): - """ - :py:obj:`NetscapeSPKI` returns an instance of :py:obj:`NetscapeSPKIType`. - """ - nspki = NetscapeSPKI() - self.assertTrue(isinstance(nspki, NetscapeSPKIType)) - - - def test_invalid_attribute(self): - """ - Accessing a non-existent attribute of a :py:obj:`NetscapeSPKI` instance causes - an :py:obj:`AttributeError` to be raised. - """ - nspki = NetscapeSPKI() - self.assertRaises(AttributeError, lambda: nspki.foo) - - - def test_b64_encode(self): - """ - :py:obj:`NetscapeSPKI.b64_encode` encodes the certificate to a base64 blob. - """ - nspki = NetscapeSPKI() - blob = nspki.b64_encode() - self.assertTrue(isinstance(blob, binary_type)) - - - -class RevokedTests(TestCase): - """ - Tests for :py:obj:`OpenSSL.crypto.Revoked` - """ - def test_construction(self): - """ - Confirm we can create :py:obj:`OpenSSL.crypto.Revoked`. Check - that it is empty. - """ - revoked = Revoked() - self.assertTrue(isinstance(revoked, Revoked)) - self.assertEquals(type(revoked), Revoked) - self.assertEquals(revoked.get_serial(), b('00')) - self.assertEquals(revoked.get_rev_date(), None) - self.assertEquals(revoked.get_reason(), None) - - - def test_construction_wrong_args(self): - """ - Calling :py:obj:`OpenSSL.crypto.Revoked` with any arguments results - in a :py:obj:`TypeError` being raised. - """ - self.assertRaises(TypeError, Revoked, None) - self.assertRaises(TypeError, Revoked, 1) - self.assertRaises(TypeError, Revoked, "foo") - - - def test_serial(self): - """ - Confirm we can set and get serial numbers from - :py:obj:`OpenSSL.crypto.Revoked`. Confirm errors are handled - with grace. - """ - revoked = Revoked() - ret = revoked.set_serial(b('10b')) - self.assertEquals(ret, None) - ser = revoked.get_serial() - self.assertEquals(ser, b('010B')) - - revoked.set_serial(b('31ppp')) # a type error would be nice - ser = revoked.get_serial() - self.assertEquals(ser, b('31')) - - self.assertRaises(ValueError, revoked.set_serial, b('pqrst')) - self.assertRaises(TypeError, revoked.set_serial, 100) - self.assertRaises(TypeError, revoked.get_serial, 1) - self.assertRaises(TypeError, revoked.get_serial, None) - self.assertRaises(TypeError, revoked.get_serial, "") - - - def test_date(self): - """ - Confirm we can set and get revocation dates from - :py:obj:`OpenSSL.crypto.Revoked`. Confirm errors are handled - with grace. - """ - revoked = Revoked() - date = revoked.get_rev_date() - self.assertEquals(date, None) - - now = b(datetime.now().strftime("%Y%m%d%H%M%SZ")) - ret = revoked.set_rev_date(now) - self.assertEqual(ret, None) - date = revoked.get_rev_date() - self.assertEqual(date, now) - - - def test_reason(self): - """ - Confirm we can set and get revocation reasons from - :py:obj:`OpenSSL.crypto.Revoked`. The "get" need to work - as "set". Likewise, each reason of all_reasons() must work. - """ - revoked = Revoked() - for r in revoked.all_reasons(): - for x in range(2): - ret = revoked.set_reason(r) - self.assertEquals(ret, None) - reason = revoked.get_reason() - self.assertEquals( - reason.lower().replace(b(' '), b('')), - r.lower().replace(b(' '), b(''))) - r = reason # again with the resp of get - - revoked.set_reason(None) - self.assertEqual(revoked.get_reason(), None) - - - def test_set_reason_wrong_arguments(self): - """ - Calling :py:obj:`OpenSSL.crypto.Revoked.set_reason` with other than - one argument, or an argument which isn't a valid reason, - results in :py:obj:`TypeError` or :py:obj:`ValueError` being raised. - """ - revoked = Revoked() - self.assertRaises(TypeError, revoked.set_reason, 100) - self.assertRaises(ValueError, revoked.set_reason, b('blue')) - - - def test_get_reason_wrong_arguments(self): - """ - Calling :py:obj:`OpenSSL.crypto.Revoked.get_reason` with any - arguments results in :py:obj:`TypeError` being raised. - """ - revoked = Revoked() - self.assertRaises(TypeError, revoked.get_reason, None) - self.assertRaises(TypeError, revoked.get_reason, 1) - self.assertRaises(TypeError, revoked.get_reason, "foo") - - - -class CRLTests(TestCase): - """ - Tests for :py:obj:`OpenSSL.crypto.CRL` - """ - cert = load_certificate(FILETYPE_PEM, cleartextCertificatePEM) - pkey = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) - - def test_construction(self): - """ - Confirm we can create :py:obj:`OpenSSL.crypto.CRL`. Check - that it is empty - """ - crl = CRL() - self.assertTrue( isinstance(crl, CRL) ) - self.assertEqual(crl.get_revoked(), None) - - - def test_construction_wrong_args(self): - """ - Calling :py:obj:`OpenSSL.crypto.CRL` with any number of arguments - results in a :py:obj:`TypeError` being raised. - """ - self.assertRaises(TypeError, CRL, 1) - self.assertRaises(TypeError, CRL, "") - self.assertRaises(TypeError, CRL, None) - - - def test_export(self): - """ - Use python to create a simple CRL with a revocation, and export - the CRL in formats of PEM, DER and text. Those outputs are verified - with the openssl program. - """ - crl = CRL() - revoked = Revoked() - now = b(datetime.now().strftime("%Y%m%d%H%M%SZ")) - revoked.set_rev_date(now) - revoked.set_serial(b('3ab')) - revoked.set_reason(b('sUpErSeDEd')) - crl.add_revoked(revoked) - - # PEM format - dumped_crl = crl.export(self.cert, self.pkey, days=20) - text = _runopenssl(dumped_crl, b"crl", b"-noout", b"-text") - text.index(b('Serial Number: 03AB')) - text.index(b('Superseded')) - text.index(b('Issuer: /C=US/ST=IL/L=Chicago/O=Testing/CN=Testing Root CA')) - - # DER format - dumped_crl = crl.export(self.cert, self.pkey, FILETYPE_ASN1) - text = _runopenssl(dumped_crl, b"crl", b"-noout", b"-text", b"-inform", b"DER") - text.index(b('Serial Number: 03AB')) - text.index(b('Superseded')) - text.index(b('Issuer: /C=US/ST=IL/L=Chicago/O=Testing/CN=Testing Root CA')) - - # text format - dumped_text = crl.export(self.cert, self.pkey, type=FILETYPE_TEXT) - self.assertEqual(text, dumped_text) - - - def test_export_invalid(self): - """ - If :py:obj:`CRL.export` is used with an uninitialized :py:obj:`X509` - instance, :py:obj:`OpenSSL.crypto.Error` is raised. - """ - crl = CRL() - self.assertRaises(Error, crl.export, X509(), PKey()) - - - def test_add_revoked_keyword(self): - """ - :py:obj:`OpenSSL.CRL.add_revoked` accepts its single argument as the - ``revoked`` keyword argument. - """ - crl = CRL() - revoked = Revoked() - crl.add_revoked(revoked=revoked) - self.assertTrue(isinstance(crl.get_revoked()[0], Revoked)) - - - def test_export_wrong_args(self): - """ - Calling :py:obj:`OpenSSL.CRL.export` with fewer than two or more than - four arguments, or with arguments other than the certificate, - private key, integer file type, and integer number of days it - expects, results in a :py:obj:`TypeError` being raised. - """ - crl = CRL() - self.assertRaises(TypeError, crl.export) - self.assertRaises(TypeError, crl.export, self.cert) - self.assertRaises(TypeError, crl.export, self.cert, self.pkey, FILETYPE_PEM, 10, "foo") - - self.assertRaises(TypeError, crl.export, None, self.pkey, FILETYPE_PEM, 10) - self.assertRaises(TypeError, crl.export, self.cert, None, FILETYPE_PEM, 10) - self.assertRaises(TypeError, crl.export, self.cert, self.pkey, None, 10) - self.assertRaises(TypeError, crl.export, self.cert, FILETYPE_PEM, None) - - - def test_export_unknown_filetype(self): - """ - Calling :py:obj:`OpenSSL.CRL.export` with a file type other than - :py:obj:`FILETYPE_PEM`, :py:obj:`FILETYPE_ASN1`, or :py:obj:`FILETYPE_TEXT` results - in a :py:obj:`ValueError` being raised. - """ - crl = CRL() - self.assertRaises(ValueError, crl.export, self.cert, self.pkey, 100, 10) - - - def test_get_revoked(self): - """ - Use python to create a simple CRL with two revocations. - Get back the :py:obj:`Revoked` using :py:obj:`OpenSSL.CRL.get_revoked` and - verify them. - """ - crl = CRL() - - revoked = Revoked() - now = b(datetime.now().strftime("%Y%m%d%H%M%SZ")) - revoked.set_rev_date(now) - revoked.set_serial(b('3ab')) - crl.add_revoked(revoked) - revoked.set_serial(b('100')) - revoked.set_reason(b('sUpErSeDEd')) - crl.add_revoked(revoked) - - revs = crl.get_revoked() - self.assertEqual(len(revs), 2) - self.assertEqual(type(revs[0]), Revoked) - self.assertEqual(type(revs[1]), Revoked) - self.assertEqual(revs[0].get_serial(), b('03AB')) - self.assertEqual(revs[1].get_serial(), b('0100')) - self.assertEqual(revs[0].get_rev_date(), now) - self.assertEqual(revs[1].get_rev_date(), now) - - - def test_get_revoked_wrong_args(self): - """ - Calling :py:obj:`OpenSSL.CRL.get_revoked` with any arguments results - in a :py:obj:`TypeError` being raised. - """ - crl = CRL() - self.assertRaises(TypeError, crl.get_revoked, None) - self.assertRaises(TypeError, crl.get_revoked, 1) - self.assertRaises(TypeError, crl.get_revoked, "") - self.assertRaises(TypeError, crl.get_revoked, "", 1, None) - - - def test_add_revoked_wrong_args(self): - """ - Calling :py:obj:`OpenSSL.CRL.add_revoked` with other than one - argument results in a :py:obj:`TypeError` being raised. - """ - crl = CRL() - self.assertRaises(TypeError, crl.add_revoked) - self.assertRaises(TypeError, crl.add_revoked, 1, 2) - self.assertRaises(TypeError, crl.add_revoked, "foo", "bar") - - - def test_load_crl(self): - """ - Load a known CRL and inspect its revocations. Both - PEM and DER formats are loaded. - """ - crl = load_crl(FILETYPE_PEM, crlData) - revs = crl.get_revoked() - self.assertEqual(len(revs), 2) - self.assertEqual(revs[0].get_serial(), b('03AB')) - self.assertEqual(revs[0].get_reason(), None) - self.assertEqual(revs[1].get_serial(), b('0100')) - self.assertEqual(revs[1].get_reason(), b('Superseded')) - - der = _runopenssl(crlData, b"crl", b"-outform", b"DER") - crl = load_crl(FILETYPE_ASN1, der) - revs = crl.get_revoked() - self.assertEqual(len(revs), 2) - self.assertEqual(revs[0].get_serial(), b('03AB')) - self.assertEqual(revs[0].get_reason(), None) - self.assertEqual(revs[1].get_serial(), b('0100')) - self.assertEqual(revs[1].get_reason(), b('Superseded')) - - - def test_load_crl_wrong_args(self): - """ - Calling :py:obj:`OpenSSL.crypto.load_crl` with other than two - arguments results in a :py:obj:`TypeError` being raised. - """ - self.assertRaises(TypeError, load_crl) - self.assertRaises(TypeError, load_crl, FILETYPE_PEM) - self.assertRaises(TypeError, load_crl, FILETYPE_PEM, crlData, None) - - - def test_load_crl_bad_filetype(self): - """ - Calling :py:obj:`OpenSSL.crypto.load_crl` with an unknown file type - raises a :py:obj:`ValueError`. - """ - self.assertRaises(ValueError, load_crl, 100, crlData) - - - def test_load_crl_bad_data(self): - """ - Calling :py:obj:`OpenSSL.crypto.load_crl` with file data which can't - be loaded raises a :py:obj:`OpenSSL.crypto.Error`. - """ - self.assertRaises(Error, load_crl, FILETYPE_PEM, b"hello, world") - - - -class SignVerifyTests(TestCase): - """ - Tests for :py:obj:`OpenSSL.crypto.sign` and :py:obj:`OpenSSL.crypto.verify`. - """ - def test_sign_verify(self): - """ - :py:obj:`sign` generates a cryptographic signature which :py:obj:`verify` can check. - """ - content = b( - "It was a bright cold day in April, and the clocks were striking " - "thirteen. Winston Smith, his chin nuzzled into his breast in an " - "effort to escape the vile wind, slipped quickly through the " - "glass doors of Victory Mansions, though not quickly enough to " - "prevent a swirl of gritty dust from entering along with him.") - - # sign the content with this private key - priv_key = load_privatekey(FILETYPE_PEM, root_key_pem) - # verify the content with this cert - good_cert = load_certificate(FILETYPE_PEM, root_cert_pem) - # certificate unrelated to priv_key, used to trigger an error - bad_cert = load_certificate(FILETYPE_PEM, server_cert_pem) - - for digest in ['md5', 'sha1']: - sig = sign(priv_key, content, digest) - - # Verify the signature of content, will throw an exception if error. - verify(good_cert, sig, content, digest) - - # This should fail because the certificate doesn't match the - # private key that was used to sign the content. - self.assertRaises(Error, verify, bad_cert, sig, content, digest) - - # This should fail because we've "tainted" the content after - # signing it. - self.assertRaises( - Error, verify, - good_cert, sig, content + b("tainted"), digest) - - # test that unknown digest types fail - self.assertRaises( - ValueError, sign, priv_key, content, "strange-digest") - self.assertRaises( - ValueError, verify, good_cert, sig, content, "strange-digest") - - - def test_sign_nulls(self): - """ - :py:obj:`sign` produces a signature for a string with embedded nulls. - """ - content = b("Watch out! \0 Did you see it?") - priv_key = load_privatekey(FILETYPE_PEM, root_key_pem) - good_cert = load_certificate(FILETYPE_PEM, root_cert_pem) - sig = sign(priv_key, content, "sha1") - verify(good_cert, sig, content, "sha1") - - -if __name__ == '__main__': - main() diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_rand.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_rand.py deleted file mode 100644 index c52cb6b..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_rand.py +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (c) Frederick Dean -# See LICENSE for details. - -""" -Unit tests for :py:obj:`OpenSSL.rand`. -""" - -from unittest import main -import os -import stat -import sys - -from OpenSSL.test.util import TestCase, b -from OpenSSL import rand - - -class RandTests(TestCase): - def test_bytes_wrong_args(self): - """ - :py:obj:`OpenSSL.rand.bytes` raises :py:obj:`TypeError` if called with the wrong - number of arguments or with a non-:py:obj:`int` argument. - """ - self.assertRaises(TypeError, rand.bytes) - self.assertRaises(TypeError, rand.bytes, None) - self.assertRaises(TypeError, rand.bytes, 3, None) - - - def test_insufficientMemory(self): - """ - :py:obj:`OpenSSL.rand.bytes` raises :py:obj:`MemoryError` if more bytes - are requested than will fit in memory. - """ - self.assertRaises(MemoryError, rand.bytes, sys.maxsize) - - - def test_bytes(self): - """ - Verify that we can obtain bytes from rand_bytes() and - that they are different each time. Test the parameter - of rand_bytes() for bad values. - """ - b1 = rand.bytes(50) - self.assertEqual(len(b1), 50) - b2 = rand.bytes(num_bytes=50) # parameter by name - self.assertNotEqual(b1, b2) # Hip, Hip, Horay! FIPS complaince - b3 = rand.bytes(num_bytes=0) - self.assertEqual(len(b3), 0) - exc = self.assertRaises(ValueError, rand.bytes, -1) - self.assertEqual(str(exc), "num_bytes must not be negative") - - - def test_add_wrong_args(self): - """ - When called with the wrong number of arguments, or with arguments not of - type :py:obj:`str` and :py:obj:`int`, :py:obj:`OpenSSL.rand.add` raises :py:obj:`TypeError`. - """ - self.assertRaises(TypeError, rand.add) - self.assertRaises(TypeError, rand.add, b("foo"), None) - self.assertRaises(TypeError, rand.add, None, 3) - self.assertRaises(TypeError, rand.add, b("foo"), 3, None) - - - def test_add(self): - """ - :py:obj:`OpenSSL.rand.add` adds entropy to the PRNG. - """ - rand.add(b('hamburger'), 3) - - - def test_seed_wrong_args(self): - """ - When called with the wrong number of arguments, or with a non-:py:obj:`str` - argument, :py:obj:`OpenSSL.rand.seed` raises :py:obj:`TypeError`. - """ - self.assertRaises(TypeError, rand.seed) - self.assertRaises(TypeError, rand.seed, None) - self.assertRaises(TypeError, rand.seed, b("foo"), None) - - - def test_seed(self): - """ - :py:obj:`OpenSSL.rand.seed` adds entropy to the PRNG. - """ - rand.seed(b('milk shake')) - - - def test_status_wrong_args(self): - """ - :py:obj:`OpenSSL.rand.status` raises :py:obj:`TypeError` when called with any - arguments. - """ - self.assertRaises(TypeError, rand.status, None) - - - def test_status(self): - """ - :py:obj:`OpenSSL.rand.status` returns :py:obj:`True` if the PRNG has sufficient - entropy, :py:obj:`False` otherwise. - """ - # It's hard to know what it is actually going to return. Different - # OpenSSL random engines decide differently whether they have enough - # entropy or not. - self.assertTrue(rand.status() in (1, 2)) - - - def test_egd_wrong_args(self): - """ - :py:obj:`OpenSSL.rand.egd` raises :py:obj:`TypeError` when called with the wrong - number of arguments or with arguments not of type :py:obj:`str` and :py:obj:`int`. - """ - self.assertRaises(TypeError, rand.egd) - self.assertRaises(TypeError, rand.egd, None) - self.assertRaises(TypeError, rand.egd, "foo", None) - self.assertRaises(TypeError, rand.egd, None, 3) - self.assertRaises(TypeError, rand.egd, "foo", 3, None) - - - def test_egd_missing(self): - """ - :py:obj:`OpenSSL.rand.egd` returns :py:obj:`0` or :py:obj:`-1` if the - EGD socket passed to it does not exist. - """ - result = rand.egd(self.mktemp()) - expected = (-1, 0) - self.assertTrue( - result in expected, - "%r not in %r" % (result, expected)) - - - def test_egd_missing_and_bytes(self): - """ - :py:obj:`OpenSSL.rand.egd` returns :py:obj:`0` or :py:obj:`-1` if the - EGD socket passed to it does not exist even if a size argument is - explicitly passed. - """ - result = rand.egd(self.mktemp(), 1024) - expected = (-1, 0) - self.assertTrue( - result in expected, - "%r not in %r" % (result, expected)) - - - def test_cleanup_wrong_args(self): - """ - :py:obj:`OpenSSL.rand.cleanup` raises :py:obj:`TypeError` when called with any - arguments. - """ - self.assertRaises(TypeError, rand.cleanup, None) - - - def test_cleanup(self): - """ - :py:obj:`OpenSSL.rand.cleanup` releases the memory used by the PRNG and returns - :py:obj:`None`. - """ - self.assertIdentical(rand.cleanup(), None) - - - def test_load_file_wrong_args(self): - """ - :py:obj:`OpenSSL.rand.load_file` raises :py:obj:`TypeError` when called the wrong - number of arguments or arguments not of type :py:obj:`str` and :py:obj:`int`. - """ - self.assertRaises(TypeError, rand.load_file) - self.assertRaises(TypeError, rand.load_file, "foo", None) - self.assertRaises(TypeError, rand.load_file, None, 1) - self.assertRaises(TypeError, rand.load_file, "foo", 1, None) - - - def test_write_file_wrong_args(self): - """ - :py:obj:`OpenSSL.rand.write_file` raises :py:obj:`TypeError` when called with the - wrong number of arguments or a non-:py:obj:`str` argument. - """ - self.assertRaises(TypeError, rand.write_file) - self.assertRaises(TypeError, rand.write_file, None) - self.assertRaises(TypeError, rand.write_file, "foo", None) - - - def test_files(self): - """ - Test reading and writing of files via rand functions. - """ - # Write random bytes to a file - tmpfile = self.mktemp() - # Make sure it exists (so cleanup definitely succeeds) - fObj = open(tmpfile, 'w') - fObj.close() - try: - rand.write_file(tmpfile) - # Verify length of written file - size = os.stat(tmpfile)[stat.ST_SIZE] - self.assertEqual(1024, size) - # Read random bytes from file - rand.load_file(tmpfile) - rand.load_file(tmpfile, 4) # specify a length - finally: - # Cleanup - os.unlink(tmpfile) - - -if __name__ == '__main__': - main() diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_ssl.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_ssl.py deleted file mode 100644 index a6f0127..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/test_ssl.py +++ /dev/null @@ -1,2736 +0,0 @@ -# Copyright (C) Jean-Paul Calderone -# See LICENSE for details. - -""" -Unit tests for :py:obj:`OpenSSL.SSL`. -""" - -from gc import collect, get_referrers -from errno import ECONNREFUSED, EINPROGRESS, EWOULDBLOCK, EPIPE, ESHUTDOWN -from sys import platform, version_info -from socket import SHUT_RDWR, error, socket -from os import makedirs -from os.path import join -from unittest import main -from weakref import ref - -from six import PY3, u - -from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM -from OpenSSL.crypto import PKey, X509, X509Extension, X509Store -from OpenSSL.crypto import dump_privatekey, load_privatekey -from OpenSSL.crypto import dump_certificate, load_certificate - -from OpenSSL.SSL import OPENSSL_VERSION_NUMBER, SSLEAY_VERSION, SSLEAY_CFLAGS -from OpenSSL.SSL import SSLEAY_PLATFORM, SSLEAY_DIR, SSLEAY_BUILT_ON -from OpenSSL.SSL import SENT_SHUTDOWN, RECEIVED_SHUTDOWN -from OpenSSL.SSL import ( - SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, TLSv1_METHOD, - TLSv1_1_METHOD, TLSv1_2_METHOD) -from OpenSSL.SSL import OP_SINGLE_DH_USE, OP_NO_SSLv2, OP_NO_SSLv3 -from OpenSSL.SSL import ( - VERIFY_PEER, VERIFY_FAIL_IF_NO_PEER_CERT, VERIFY_CLIENT_ONCE, VERIFY_NONE) - -from OpenSSL.SSL import ( - SESS_CACHE_OFF, SESS_CACHE_CLIENT, SESS_CACHE_SERVER, SESS_CACHE_BOTH, - SESS_CACHE_NO_AUTO_CLEAR, SESS_CACHE_NO_INTERNAL_LOOKUP, - SESS_CACHE_NO_INTERNAL_STORE, SESS_CACHE_NO_INTERNAL) - -from OpenSSL.SSL import ( - Error, SysCallError, WantReadError, WantWriteError, ZeroReturnError) -from OpenSSL.SSL import ( - Context, ContextType, Session, Connection, ConnectionType, SSLeay_version) - -from OpenSSL.test.util import TestCase, b -from OpenSSL.test.test_crypto import ( - cleartextCertificatePEM, cleartextPrivateKeyPEM) -from OpenSSL.test.test_crypto import ( - client_cert_pem, client_key_pem, server_cert_pem, server_key_pem, - root_cert_pem) - -try: - from OpenSSL.SSL import OP_NO_QUERY_MTU -except ImportError: - OP_NO_QUERY_MTU = None -try: - from OpenSSL.SSL import OP_COOKIE_EXCHANGE -except ImportError: - OP_COOKIE_EXCHANGE = None -try: - from OpenSSL.SSL import OP_NO_TICKET -except ImportError: - OP_NO_TICKET = None - -try: - from OpenSSL.SSL import OP_NO_COMPRESSION -except ImportError: - OP_NO_COMPRESSION = None - -try: - from OpenSSL.SSL import MODE_RELEASE_BUFFERS -except ImportError: - MODE_RELEASE_BUFFERS = None - -try: - from OpenSSL.SSL import OP_NO_TLSv1, OP_NO_TLSv1_1, OP_NO_TLSv1_2 -except ImportError: - OP_NO_TLSv1 = OP_NO_TLSv1_1 = OP_NO_TLSv1_2 = None - -from OpenSSL.SSL import ( - SSL_ST_CONNECT, SSL_ST_ACCEPT, SSL_ST_MASK, SSL_ST_INIT, SSL_ST_BEFORE, - SSL_ST_OK, SSL_ST_RENEGOTIATE, - SSL_CB_LOOP, SSL_CB_EXIT, SSL_CB_READ, SSL_CB_WRITE, SSL_CB_ALERT, - SSL_CB_READ_ALERT, SSL_CB_WRITE_ALERT, SSL_CB_ACCEPT_LOOP, - SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP, SSL_CB_CONNECT_EXIT, - SSL_CB_HANDSHAKE_START, SSL_CB_HANDSHAKE_DONE) - -# openssl dhparam 128 -out dh-128.pem (note that 128 is a small number of bits -# to use) -dhparam = """\ ------BEGIN DH PARAMETERS----- -MBYCEQCobsg29c9WZP/54oAPcwiDAgEC ------END DH PARAMETERS----- -""" - - -def verify_cb(conn, cert, errnum, depth, ok): - return ok - - -def socket_pair(): - """ - Establish and return a pair of network sockets connected to each other. - """ - # Connect a pair of sockets - port = socket() - port.bind(('', 0)) - port.listen(1) - client = socket() - client.setblocking(False) - client.connect_ex(("127.0.0.1", port.getsockname()[1])) - client.setblocking(True) - server = port.accept()[0] - - # Let's pass some unencrypted data to make sure our socket connection is - # fine. Just one byte, so we don't have to worry about buffers getting - # filled up or fragmentation. - server.send(b("x")) - assert client.recv(1024) == b("x") - client.send(b("y")) - assert server.recv(1024) == b("y") - - # Most of our callers want non-blocking sockets, make it easy for them. - server.setblocking(False) - client.setblocking(False) - - return (server, client) - - - -def handshake(client, server): - conns = [client, server] - while conns: - for conn in conns: - try: - conn.do_handshake() - except WantReadError: - pass - else: - conns.remove(conn) - - -def _create_certificate_chain(): - """ - Construct and return a chain of certificates. - - 1. A new self-signed certificate authority certificate (cacert) - 2. A new intermediate certificate signed by cacert (icert) - 3. A new server certificate signed by icert (scert) - """ - caext = X509Extension(b('basicConstraints'), False, b('CA:true')) - - # Step 1 - cakey = PKey() - cakey.generate_key(TYPE_RSA, 512) - cacert = X509() - cacert.get_subject().commonName = "Authority Certificate" - cacert.set_issuer(cacert.get_subject()) - cacert.set_pubkey(cakey) - cacert.set_notBefore(b("20000101000000Z")) - cacert.set_notAfter(b("20200101000000Z")) - cacert.add_extensions([caext]) - cacert.set_serial_number(0) - cacert.sign(cakey, "sha1") - - # Step 2 - ikey = PKey() - ikey.generate_key(TYPE_RSA, 512) - icert = X509() - icert.get_subject().commonName = "Intermediate Certificate" - icert.set_issuer(cacert.get_subject()) - icert.set_pubkey(ikey) - icert.set_notBefore(b("20000101000000Z")) - icert.set_notAfter(b("20200101000000Z")) - icert.add_extensions([caext]) - icert.set_serial_number(0) - icert.sign(cakey, "sha1") - - # Step 3 - skey = PKey() - skey.generate_key(TYPE_RSA, 512) - scert = X509() - scert.get_subject().commonName = "Server Certificate" - scert.set_issuer(icert.get_subject()) - scert.set_pubkey(skey) - scert.set_notBefore(b("20000101000000Z")) - scert.set_notAfter(b("20200101000000Z")) - scert.add_extensions([ - X509Extension(b('basicConstraints'), True, b('CA:false'))]) - scert.set_serial_number(0) - scert.sign(ikey, "sha1") - - return [(cakey, cacert), (ikey, icert), (skey, scert)] - - - -class _LoopbackMixin: - """ - Helper mixin which defines methods for creating a connected socket pair and - for forcing two connected SSL sockets to talk to each other via memory BIOs. - """ - def _loopbackClientFactory(self, socket): - client = Connection(Context(TLSv1_METHOD), socket) - client.set_connect_state() - return client - - - def _loopbackServerFactory(self, socket): - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - ctx.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - server = Connection(ctx, socket) - server.set_accept_state() - return server - - - def _loopback(self, serverFactory=None, clientFactory=None): - if serverFactory is None: - serverFactory = self._loopbackServerFactory - if clientFactory is None: - clientFactory = self._loopbackClientFactory - - (server, client) = socket_pair() - server = serverFactory(server) - client = clientFactory(client) - - handshake(client, server) - - server.setblocking(True) - client.setblocking(True) - return server, client - - - def _interactInMemory(self, client_conn, server_conn): - """ - Try to read application bytes from each of the two :py:obj:`Connection` - objects. Copy bytes back and forth between their send/receive buffers - for as long as there is anything to copy. When there is nothing more - to copy, return :py:obj:`None`. If one of them actually manages to deliver - some application bytes, return a two-tuple of the connection from which - the bytes were read and the bytes themselves. - """ - wrote = True - while wrote: - # Loop until neither side has anything to say - wrote = False - - # Copy stuff from each side's send buffer to the other side's - # receive buffer. - for (read, write) in [(client_conn, server_conn), - (server_conn, client_conn)]: - - # Give the side a chance to generate some more bytes, or - # succeed. - try: - data = read.recv(2 ** 16) - except WantReadError: - # It didn't succeed, so we'll hope it generated some - # output. - pass - else: - # It did succeed, so we'll stop now and let the caller deal - # with it. - return (read, data) - - while True: - # Keep copying as long as there's more stuff there. - try: - dirty = read.bio_read(4096) - except WantReadError: - # Okay, nothing more waiting to be sent. Stop - # processing this send buffer. - break - else: - # Keep track of the fact that someone generated some - # output. - wrote = True - write.bio_write(dirty) - - - -class VersionTests(TestCase): - """ - Tests for version information exposed by - :py:obj:`OpenSSL.SSL.SSLeay_version` and - :py:obj:`OpenSSL.SSL.OPENSSL_VERSION_NUMBER`. - """ - def test_OPENSSL_VERSION_NUMBER(self): - """ - :py:obj:`OPENSSL_VERSION_NUMBER` is an integer with status in the low - byte and the patch, fix, minor, and major versions in the - nibbles above that. - """ - self.assertTrue(isinstance(OPENSSL_VERSION_NUMBER, int)) - - - def test_SSLeay_version(self): - """ - :py:obj:`SSLeay_version` takes a version type indicator and returns - one of a number of version strings based on that indicator. - """ - versions = {} - for t in [SSLEAY_VERSION, SSLEAY_CFLAGS, SSLEAY_BUILT_ON, - SSLEAY_PLATFORM, SSLEAY_DIR]: - version = SSLeay_version(t) - versions[version] = t - self.assertTrue(isinstance(version, bytes)) - self.assertEqual(len(versions), 5) - - - -class ContextTests(TestCase, _LoopbackMixin): - """ - Unit tests for :py:obj:`OpenSSL.SSL.Context`. - """ - def test_method(self): - """ - :py:obj:`Context` can be instantiated with one of :py:obj:`SSLv2_METHOD`, - :py:obj:`SSLv3_METHOD`, :py:obj:`SSLv23_METHOD`, :py:obj:`TLSv1_METHOD`, - :py:obj:`TLSv1_1_METHOD`, or :py:obj:`TLSv1_2_METHOD`. - """ - methods = [ - SSLv3_METHOD, SSLv23_METHOD, TLSv1_METHOD] - for meth in methods: - Context(meth) - - - maybe = [SSLv2_METHOD, TLSv1_1_METHOD, TLSv1_2_METHOD] - for meth in maybe: - try: - Context(meth) - except (Error, ValueError): - # Some versions of OpenSSL have SSLv2 / TLSv1.1 / TLSv1.2, some - # don't. Difficult to say in advance. - pass - - self.assertRaises(TypeError, Context, "") - self.assertRaises(ValueError, Context, 10) - - - if not PY3: - def test_method_long(self): - """ - On Python 2 :py:class:`Context` accepts values of type - :py:obj:`long` as well as :py:obj:`int`. - """ - Context(long(TLSv1_METHOD)) - - - - def test_type(self): - """ - :py:obj:`Context` and :py:obj:`ContextType` refer to the same type object and can be - used to create instances of that type. - """ - self.assertIdentical(Context, ContextType) - self.assertConsistentType(Context, 'Context', TLSv1_METHOD) - - - def test_use_privatekey(self): - """ - :py:obj:`Context.use_privatekey` takes an :py:obj:`OpenSSL.crypto.PKey` instance. - """ - key = PKey() - key.generate_key(TYPE_RSA, 128) - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey(key) - self.assertRaises(TypeError, ctx.use_privatekey, "") - - - def test_use_privatekey_file_missing(self): - """ - :py:obj:`Context.use_privatekey_file` raises :py:obj:`OpenSSL.SSL.Error` - when passed the name of a file which does not exist. - """ - ctx = Context(TLSv1_METHOD) - self.assertRaises(Error, ctx.use_privatekey_file, self.mktemp()) - - - if not PY3: - def test_use_privatekey_file_long(self): - """ - On Python 2 :py:obj:`Context.use_privatekey_file` accepts a - filetype of type :py:obj:`long` as well as :py:obj:`int`. - """ - pemfile = self.mktemp() - - key = PKey() - key.generate_key(TYPE_RSA, 128) - - with open(pemfile, "wt") as pem: - pem.write( - dump_privatekey(FILETYPE_PEM, key).decode("ascii")) - - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey_file(pemfile, long(FILETYPE_PEM)) - - - def test_use_certificate_wrong_args(self): - """ - :py:obj:`Context.use_certificate_wrong_args` raises :py:obj:`TypeError` - when not passed exactly one :py:obj:`OpenSSL.crypto.X509` instance as an - argument. - """ - ctx = Context(TLSv1_METHOD) - self.assertRaises(TypeError, ctx.use_certificate) - self.assertRaises(TypeError, ctx.use_certificate, "hello, world") - self.assertRaises(TypeError, ctx.use_certificate, X509(), "hello, world") - - - def test_use_certificate_uninitialized(self): - """ - :py:obj:`Context.use_certificate` raises :py:obj:`OpenSSL.SSL.Error` - when passed a :py:obj:`OpenSSL.crypto.X509` instance which has not been - initialized (ie, which does not actually have any certificate data). - """ - ctx = Context(TLSv1_METHOD) - self.assertRaises(Error, ctx.use_certificate, X509()) - - - def test_use_certificate(self): - """ - :py:obj:`Context.use_certificate` sets the certificate which will be - used to identify connections created using the context. - """ - # TODO - # Hard to assert anything. But we could set a privatekey then ask - # OpenSSL if the cert and key agree using check_privatekey. Then as - # long as check_privatekey works right we're good... - ctx = Context(TLSv1_METHOD) - ctx.use_certificate(load_certificate(FILETYPE_PEM, cleartextCertificatePEM)) - - - def test_use_certificate_file_wrong_args(self): - """ - :py:obj:`Context.use_certificate_file` raises :py:obj:`TypeError` if - called with zero arguments or more than two arguments, or if the first - argument is not a byte string or the second argumnent is not an integer. - """ - ctx = Context(TLSv1_METHOD) - self.assertRaises(TypeError, ctx.use_certificate_file) - self.assertRaises(TypeError, ctx.use_certificate_file, b"somefile", object()) - self.assertRaises( - TypeError, ctx.use_certificate_file, b"somefile", FILETYPE_PEM, object()) - self.assertRaises( - TypeError, ctx.use_certificate_file, object(), FILETYPE_PEM) - self.assertRaises( - TypeError, ctx.use_certificate_file, b"somefile", object()) - - - def test_use_certificate_file_missing(self): - """ - :py:obj:`Context.use_certificate_file` raises - `:py:obj:`OpenSSL.SSL.Error` if passed the name of a file which does not - exist. - """ - ctx = Context(TLSv1_METHOD) - self.assertRaises(Error, ctx.use_certificate_file, self.mktemp()) - - - def test_use_certificate_file(self): - """ - :py:obj:`Context.use_certificate` sets the certificate which will be - used to identify connections created using the context. - """ - # TODO - # Hard to assert anything. But we could set a privatekey then ask - # OpenSSL if the cert and key agree using check_privatekey. Then as - # long as check_privatekey works right we're good... - pem_filename = self.mktemp() - with open(pem_filename, "wb") as pem_file: - pem_file.write(cleartextCertificatePEM) - - ctx = Context(TLSv1_METHOD) - ctx.use_certificate_file(pem_filename) - - - if not PY3: - def test_use_certificate_file_long(self): - """ - On Python 2 :py:obj:`Context.use_certificate_file` accepts a - filetype of type :py:obj:`long` as well as :py:obj:`int`. - """ - pem_filename = self.mktemp() - with open(pem_filename, "wb") as pem_file: - pem_file.write(cleartextCertificatePEM) - - ctx = Context(TLSv1_METHOD) - ctx.use_certificate_file(pem_filename, long(FILETYPE_PEM)) - - - def test_set_app_data_wrong_args(self): - """ - :py:obj:`Context.set_app_data` raises :py:obj:`TypeError` if called with other than - one argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_app_data) - self.assertRaises(TypeError, context.set_app_data, None, None) - - - def test_get_app_data_wrong_args(self): - """ - :py:obj:`Context.get_app_data` raises :py:obj:`TypeError` if called with any - arguments. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.get_app_data, None) - - - def test_app_data(self): - """ - :py:obj:`Context.set_app_data` stores an object for later retrieval using - :py:obj:`Context.get_app_data`. - """ - app_data = object() - context = Context(TLSv1_METHOD) - context.set_app_data(app_data) - self.assertIdentical(context.get_app_data(), app_data) - - - def test_set_options_wrong_args(self): - """ - :py:obj:`Context.set_options` raises :py:obj:`TypeError` if called with the wrong - number of arguments or a non-:py:obj:`int` argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_options) - self.assertRaises(TypeError, context.set_options, None) - self.assertRaises(TypeError, context.set_options, 1, None) - - - def test_set_options(self): - """ - :py:obj:`Context.set_options` returns the new options value. - """ - context = Context(TLSv1_METHOD) - options = context.set_options(OP_NO_SSLv2) - self.assertTrue(OP_NO_SSLv2 & options) - - - if not PY3: - def test_set_options_long(self): - """ - On Python 2 :py:obj:`Context.set_options` accepts values of type - :py:obj:`long` as well as :py:obj:`int`. - """ - context = Context(TLSv1_METHOD) - options = context.set_options(long(OP_NO_SSLv2)) - self.assertTrue(OP_NO_SSLv2 & options) - - - def test_set_mode_wrong_args(self): - """ - :py:obj:`Context.set`mode} raises :py:obj:`TypeError` if called with the wrong - number of arguments or a non-:py:obj:`int` argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_mode) - self.assertRaises(TypeError, context.set_mode, None) - self.assertRaises(TypeError, context.set_mode, 1, None) - - - if MODE_RELEASE_BUFFERS is not None: - def test_set_mode(self): - """ - :py:obj:`Context.set_mode` accepts a mode bitvector and returns the newly - set mode. - """ - context = Context(TLSv1_METHOD) - self.assertTrue( - MODE_RELEASE_BUFFERS & context.set_mode(MODE_RELEASE_BUFFERS)) - - if not PY3: - def test_set_mode_long(self): - """ - On Python 2 :py:obj:`Context.set_mode` accepts values of type - :py:obj:`long` as well as :py:obj:`int`. - """ - context = Context(TLSv1_METHOD) - mode = context.set_mode(long(MODE_RELEASE_BUFFERS)) - self.assertTrue(MODE_RELEASE_BUFFERS & mode) - else: - "MODE_RELEASE_BUFFERS unavailable - OpenSSL version may be too old" - - - def test_set_timeout_wrong_args(self): - """ - :py:obj:`Context.set_timeout` raises :py:obj:`TypeError` if called with the wrong - number of arguments or a non-:py:obj:`int` argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_timeout) - self.assertRaises(TypeError, context.set_timeout, None) - self.assertRaises(TypeError, context.set_timeout, 1, None) - - - def test_get_timeout_wrong_args(self): - """ - :py:obj:`Context.get_timeout` raises :py:obj:`TypeError` if called with any arguments. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.get_timeout, None) - - - def test_timeout(self): - """ - :py:obj:`Context.set_timeout` sets the session timeout for all connections - created using the context object. :py:obj:`Context.get_timeout` retrieves this - value. - """ - context = Context(TLSv1_METHOD) - context.set_timeout(1234) - self.assertEquals(context.get_timeout(), 1234) - - - if not PY3: - def test_timeout_long(self): - """ - On Python 2 :py:obj:`Context.set_timeout` accepts values of type - `long` as well as int. - """ - context = Context(TLSv1_METHOD) - context.set_timeout(long(1234)) - self.assertEquals(context.get_timeout(), 1234) - - - def test_set_verify_depth_wrong_args(self): - """ - :py:obj:`Context.set_verify_depth` raises :py:obj:`TypeError` if called with the wrong - number of arguments or a non-:py:obj:`int` argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_verify_depth) - self.assertRaises(TypeError, context.set_verify_depth, None) - self.assertRaises(TypeError, context.set_verify_depth, 1, None) - - - def test_get_verify_depth_wrong_args(self): - """ - :py:obj:`Context.get_verify_depth` raises :py:obj:`TypeError` if called with any arguments. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.get_verify_depth, None) - - - def test_verify_depth(self): - """ - :py:obj:`Context.set_verify_depth` sets the number of certificates in a chain - to follow before giving up. The value can be retrieved with - :py:obj:`Context.get_verify_depth`. - """ - context = Context(TLSv1_METHOD) - context.set_verify_depth(11) - self.assertEquals(context.get_verify_depth(), 11) - - - if not PY3: - def test_verify_depth_long(self): - """ - On Python 2 :py:obj:`Context.set_verify_depth` accepts values of - type `long` as well as int. - """ - context = Context(TLSv1_METHOD) - context.set_verify_depth(long(11)) - self.assertEquals(context.get_verify_depth(), 11) - - - def _write_encrypted_pem(self, passphrase): - """ - Write a new private key out to a new file, encrypted using the given - passphrase. Return the path to the new file. - """ - key = PKey() - key.generate_key(TYPE_RSA, 128) - pemFile = self.mktemp() - fObj = open(pemFile, 'w') - pem = dump_privatekey(FILETYPE_PEM, key, "blowfish", passphrase) - fObj.write(pem.decode('ascii')) - fObj.close() - return pemFile - - - def test_set_passwd_cb_wrong_args(self): - """ - :py:obj:`Context.set_passwd_cb` raises :py:obj:`TypeError` if called with the - wrong arguments or with a non-callable first argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_passwd_cb) - self.assertRaises(TypeError, context.set_passwd_cb, None) - self.assertRaises(TypeError, context.set_passwd_cb, lambda: None, None, None) - - - def test_set_passwd_cb(self): - """ - :py:obj:`Context.set_passwd_cb` accepts a callable which will be invoked when - a private key is loaded from an encrypted PEM. - """ - passphrase = b("foobar") - pemFile = self._write_encrypted_pem(passphrase) - calledWith = [] - def passphraseCallback(maxlen, verify, extra): - calledWith.append((maxlen, verify, extra)) - return passphrase - context = Context(TLSv1_METHOD) - context.set_passwd_cb(passphraseCallback) - context.use_privatekey_file(pemFile) - self.assertTrue(len(calledWith), 1) - self.assertTrue(isinstance(calledWith[0][0], int)) - self.assertTrue(isinstance(calledWith[0][1], int)) - self.assertEqual(calledWith[0][2], None) - - - def test_passwd_callback_exception(self): - """ - :py:obj:`Context.use_privatekey_file` propagates any exception raised by the - passphrase callback. - """ - pemFile = self._write_encrypted_pem(b("monkeys are nice")) - def passphraseCallback(maxlen, verify, extra): - raise RuntimeError("Sorry, I am a fail.") - - context = Context(TLSv1_METHOD) - context.set_passwd_cb(passphraseCallback) - self.assertRaises(RuntimeError, context.use_privatekey_file, pemFile) - - - def test_passwd_callback_false(self): - """ - :py:obj:`Context.use_privatekey_file` raises :py:obj:`OpenSSL.SSL.Error` if the - passphrase callback returns a false value. - """ - pemFile = self._write_encrypted_pem(b("monkeys are nice")) - def passphraseCallback(maxlen, verify, extra): - return b"" - - context = Context(TLSv1_METHOD) - context.set_passwd_cb(passphraseCallback) - self.assertRaises(Error, context.use_privatekey_file, pemFile) - - - def test_passwd_callback_non_string(self): - """ - :py:obj:`Context.use_privatekey_file` raises :py:obj:`OpenSSL.SSL.Error` if the - passphrase callback returns a true non-string value. - """ - pemFile = self._write_encrypted_pem(b("monkeys are nice")) - def passphraseCallback(maxlen, verify, extra): - return 10 - - context = Context(TLSv1_METHOD) - context.set_passwd_cb(passphraseCallback) - self.assertRaises(ValueError, context.use_privatekey_file, pemFile) - - - def test_passwd_callback_too_long(self): - """ - If the passphrase returned by the passphrase callback returns a string - longer than the indicated maximum length, it is truncated. - """ - # A priori knowledge! - passphrase = b("x") * 1024 - pemFile = self._write_encrypted_pem(passphrase) - def passphraseCallback(maxlen, verify, extra): - assert maxlen == 1024 - return passphrase + b("y") - - context = Context(TLSv1_METHOD) - context.set_passwd_cb(passphraseCallback) - # This shall succeed because the truncated result is the correct - # passphrase. - context.use_privatekey_file(pemFile) - - - def test_set_info_callback(self): - """ - :py:obj:`Context.set_info_callback` accepts a callable which will be invoked - when certain information about an SSL connection is available. - """ - (server, client) = socket_pair() - - clientSSL = Connection(Context(TLSv1_METHOD), client) - clientSSL.set_connect_state() - - called = [] - def info(conn, where, ret): - called.append((conn, where, ret)) - context = Context(TLSv1_METHOD) - context.set_info_callback(info) - context.use_certificate( - load_certificate(FILETYPE_PEM, cleartextCertificatePEM)) - context.use_privatekey( - load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM)) - - serverSSL = Connection(context, server) - serverSSL.set_accept_state() - - handshake(clientSSL, serverSSL) - - # The callback must always be called with a Connection instance as the - # first argument. It would probably be better to split this into - # separate tests for client and server side info callbacks so we could - # assert it is called with the right Connection instance. It would - # also be good to assert *something* about `where` and `ret`. - notConnections = [ - conn for (conn, where, ret) in called - if not isinstance(conn, Connection)] - self.assertEqual( - [], notConnections, - "Some info callback arguments were not Connection instaces.") - - - def _load_verify_locations_test(self, *args): - """ - Create a client context which will verify the peer certificate and call - its :py:obj:`load_verify_locations` method with the given arguments. - Then connect it to a server and ensure that the handshake succeeds. - """ - (server, client) = socket_pair() - - clientContext = Context(TLSv1_METHOD) - clientContext.load_verify_locations(*args) - # Require that the server certificate verify properly or the - # connection will fail. - clientContext.set_verify( - VERIFY_PEER, - lambda conn, cert, errno, depth, preverify_ok: preverify_ok) - - clientSSL = Connection(clientContext, client) - clientSSL.set_connect_state() - - serverContext = Context(TLSv1_METHOD) - serverContext.use_certificate( - load_certificate(FILETYPE_PEM, cleartextCertificatePEM)) - serverContext.use_privatekey( - load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM)) - - serverSSL = Connection(serverContext, server) - serverSSL.set_accept_state() - - # Without load_verify_locations above, the handshake - # will fail: - # Error: [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', - # 'certificate verify failed')] - handshake(clientSSL, serverSSL) - - cert = clientSSL.get_peer_certificate() - self.assertEqual(cert.get_subject().CN, 'Testing Root CA') - - - def test_load_verify_file(self): - """ - :py:obj:`Context.load_verify_locations` accepts a file name and uses the - certificates within for verification purposes. - """ - cafile = self.mktemp() - fObj = open(cafile, 'w') - fObj.write(cleartextCertificatePEM.decode('ascii')) - fObj.close() - - self._load_verify_locations_test(cafile) - - - def test_load_verify_invalid_file(self): - """ - :py:obj:`Context.load_verify_locations` raises :py:obj:`Error` when passed a - non-existent cafile. - """ - clientContext = Context(TLSv1_METHOD) - self.assertRaises( - Error, clientContext.load_verify_locations, self.mktemp()) - - - def test_load_verify_directory(self): - """ - :py:obj:`Context.load_verify_locations` accepts a directory name and uses - the certificates within for verification purposes. - """ - capath = self.mktemp() - makedirs(capath) - # Hash values computed manually with c_rehash to avoid depending on - # c_rehash in the test suite. One is from OpenSSL 0.9.8, the other - # from OpenSSL 1.0.0. - for name in [b'c7adac82.0', b'c3705638.0']: - cafile = join(capath, name) - fObj = open(cafile, 'w') - fObj.write(cleartextCertificatePEM.decode('ascii')) - fObj.close() - - self._load_verify_locations_test(None, capath) - - - def test_load_verify_locations_wrong_args(self): - """ - :py:obj:`Context.load_verify_locations` raises :py:obj:`TypeError` if called with - the wrong number of arguments or with non-:py:obj:`str` arguments. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.load_verify_locations) - self.assertRaises(TypeError, context.load_verify_locations, object()) - self.assertRaises(TypeError, context.load_verify_locations, object(), object()) - self.assertRaises(TypeError, context.load_verify_locations, None, None, None) - - - if platform == "win32": - "set_default_verify_paths appears not to work on Windows. " - "See LP#404343 and LP#404344." - else: - def test_set_default_verify_paths(self): - """ - :py:obj:`Context.set_default_verify_paths` causes the platform-specific CA - certificate locations to be used for verification purposes. - """ - # Testing this requires a server with a certificate signed by one of - # the CAs in the platform CA location. Getting one of those costs - # money. Fortunately (or unfortunately, depending on your - # perspective), it's easy to think of a public server on the - # internet which has such a certificate. Connecting to the network - # in a unit test is bad, but it's the only way I can think of to - # really test this. -exarkun - - # Arg, verisign.com doesn't speak TLSv1 - context = Context(SSLv3_METHOD) - context.set_default_verify_paths() - context.set_verify( - VERIFY_PEER, - lambda conn, cert, errno, depth, preverify_ok: preverify_ok) - - client = socket() - client.connect(('verisign.com', 443)) - clientSSL = Connection(context, client) - clientSSL.set_connect_state() - clientSSL.do_handshake() - clientSSL.send(b"GET / HTTP/1.0\r\n\r\n") - self.assertTrue(clientSSL.recv(1024)) - - - def test_set_default_verify_paths_signature(self): - """ - :py:obj:`Context.set_default_verify_paths` takes no arguments and raises - :py:obj:`TypeError` if given any. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_default_verify_paths, None) - self.assertRaises(TypeError, context.set_default_verify_paths, 1) - self.assertRaises(TypeError, context.set_default_verify_paths, "") - - - def test_add_extra_chain_cert_invalid_cert(self): - """ - :py:obj:`Context.add_extra_chain_cert` raises :py:obj:`TypeError` if called with - other than one argument or if called with an object which is not an - instance of :py:obj:`X509`. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.add_extra_chain_cert) - self.assertRaises(TypeError, context.add_extra_chain_cert, object()) - self.assertRaises(TypeError, context.add_extra_chain_cert, object(), object()) - - - def _handshake_test(self, serverContext, clientContext): - """ - Verify that a client and server created with the given contexts can - successfully handshake and communicate. - """ - serverSocket, clientSocket = socket_pair() - - server = Connection(serverContext, serverSocket) - server.set_accept_state() - - client = Connection(clientContext, clientSocket) - client.set_connect_state() - - # Make them talk to each other. - # self._interactInMemory(client, server) - for i in range(3): - for s in [client, server]: - try: - s.do_handshake() - except WantReadError: - pass - - - def test_set_verify_callback_exception(self): - """ - If the verify callback passed to :py:obj:`Context.set_verify` raises an - exception, verification fails and the exception is propagated to the - caller of :py:obj:`Connection.do_handshake`. - """ - serverContext = Context(TLSv1_METHOD) - serverContext.use_privatekey( - load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM)) - serverContext.use_certificate( - load_certificate(FILETYPE_PEM, cleartextCertificatePEM)) - - clientContext = Context(TLSv1_METHOD) - def verify_callback(*args): - raise Exception("silly verify failure") - clientContext.set_verify(VERIFY_PEER, verify_callback) - - exc = self.assertRaises( - Exception, self._handshake_test, serverContext, clientContext) - self.assertEqual("silly verify failure", str(exc)) - - - def test_add_extra_chain_cert(self): - """ - :py:obj:`Context.add_extra_chain_cert` accepts an :py:obj:`X509` instance to add to - the certificate chain. - - See :py:obj:`_create_certificate_chain` for the details of the certificate - chain tested. - - The chain is tested by starting a server with scert and connecting - to it with a client which trusts cacert and requires verification to - succeed. - """ - chain = _create_certificate_chain() - [(cakey, cacert), (ikey, icert), (skey, scert)] = chain - - # Dump the CA certificate to a file because that's the only way to load - # it as a trusted CA in the client context. - for cert, name in [(cacert, 'ca.pem'), (icert, 'i.pem'), (scert, 's.pem')]: - fObj = open(name, 'w') - fObj.write(dump_certificate(FILETYPE_PEM, cert).decode('ascii')) - fObj.close() - - for key, name in [(cakey, 'ca.key'), (ikey, 'i.key'), (skey, 's.key')]: - fObj = open(name, 'w') - fObj.write(dump_privatekey(FILETYPE_PEM, key).decode('ascii')) - fObj.close() - - # Create the server context - serverContext = Context(TLSv1_METHOD) - serverContext.use_privatekey(skey) - serverContext.use_certificate(scert) - # The client already has cacert, we only need to give them icert. - serverContext.add_extra_chain_cert(icert) - - # Create the client - clientContext = Context(TLSv1_METHOD) - clientContext.set_verify( - VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb) - clientContext.load_verify_locations(b"ca.pem") - - # Try it out. - self._handshake_test(serverContext, clientContext) - - - def test_use_certificate_chain_file(self): - """ - :py:obj:`Context.use_certificate_chain_file` reads a certificate chain from - the specified file. - - The chain is tested by starting a server with scert and connecting - to it with a client which trusts cacert and requires verification to - succeed. - """ - chain = _create_certificate_chain() - [(cakey, cacert), (ikey, icert), (skey, scert)] = chain - - # Write out the chain file. - chainFile = self.mktemp() - fObj = open(chainFile, 'wb') - # Most specific to least general. - fObj.write(dump_certificate(FILETYPE_PEM, scert)) - fObj.write(dump_certificate(FILETYPE_PEM, icert)) - fObj.write(dump_certificate(FILETYPE_PEM, cacert)) - fObj.close() - - serverContext = Context(TLSv1_METHOD) - serverContext.use_certificate_chain_file(chainFile) - serverContext.use_privatekey(skey) - - fObj = open('ca.pem', 'w') - fObj.write(dump_certificate(FILETYPE_PEM, cacert).decode('ascii')) - fObj.close() - - clientContext = Context(TLSv1_METHOD) - clientContext.set_verify( - VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb) - clientContext.load_verify_locations(b"ca.pem") - - self._handshake_test(serverContext, clientContext) - - - def test_use_certificate_chain_file_wrong_args(self): - """ - :py:obj:`Context.use_certificate_chain_file` raises :py:obj:`TypeError` - if passed zero or more than one argument or when passed a non-byte - string single argument. It also raises :py:obj:`OpenSSL.SSL.Error` when - passed a bad chain file name (for example, the name of a file which does - not exist). - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.use_certificate_chain_file) - self.assertRaises(TypeError, context.use_certificate_chain_file, object()) - self.assertRaises(TypeError, context.use_certificate_chain_file, b"foo", object()) - - self.assertRaises(Error, context.use_certificate_chain_file, self.mktemp()) - - # XXX load_client_ca - # XXX set_session_id - - def test_get_verify_mode_wrong_args(self): - """ - :py:obj:`Context.get_verify_mode` raises :py:obj:`TypeError` if called with any - arguments. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.get_verify_mode, None) - - - def test_set_verify_mode(self): - """ - :py:obj:`Context.get_verify_mode` returns the verify mode flags previously - passed to :py:obj:`Context.set_verify`. - """ - context = Context(TLSv1_METHOD) - self.assertEquals(context.get_verify_mode(), 0) - context.set_verify( - VERIFY_PEER | VERIFY_CLIENT_ONCE, lambda *args: None) - self.assertEquals( - context.get_verify_mode(), VERIFY_PEER | VERIFY_CLIENT_ONCE) - - - if not PY3: - def test_set_verify_mode_long(self): - """ - On Python 2 :py:obj:`Context.set_verify_mode` accepts values of - type :py:obj:`long` as well as :py:obj:`int`. - """ - context = Context(TLSv1_METHOD) - self.assertEquals(context.get_verify_mode(), 0) - context.set_verify( - long(VERIFY_PEER | VERIFY_CLIENT_ONCE), lambda *args: None) - self.assertEquals( - context.get_verify_mode(), VERIFY_PEER | VERIFY_CLIENT_ONCE) - - - def test_load_tmp_dh_wrong_args(self): - """ - :py:obj:`Context.load_tmp_dh` raises :py:obj:`TypeError` if called with the wrong - number of arguments or with a non-:py:obj:`str` argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.load_tmp_dh) - self.assertRaises(TypeError, context.load_tmp_dh, "foo", None) - self.assertRaises(TypeError, context.load_tmp_dh, object()) - - - def test_load_tmp_dh_missing_file(self): - """ - :py:obj:`Context.load_tmp_dh` raises :py:obj:`OpenSSL.SSL.Error` if the specified file - does not exist. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(Error, context.load_tmp_dh, b"hello") - - - def test_load_tmp_dh(self): - """ - :py:obj:`Context.load_tmp_dh` loads Diffie-Hellman parameters from the - specified file. - """ - context = Context(TLSv1_METHOD) - dhfilename = self.mktemp() - dhfile = open(dhfilename, "w") - dhfile.write(dhparam) - dhfile.close() - context.load_tmp_dh(dhfilename) - # XXX What should I assert here? -exarkun - - - def test_set_cipher_list_bytes(self): - """ - :py:obj:`Context.set_cipher_list` accepts a :py:obj:`bytes` naming the - ciphers which connections created with the context object will be able - to choose from. - """ - context = Context(TLSv1_METHOD) - context.set_cipher_list(b"hello world:EXP-RC4-MD5") - conn = Connection(context, None) - self.assertEquals(conn.get_cipher_list(), ["EXP-RC4-MD5"]) - - - def test_set_cipher_list_text(self): - """ - :py:obj:`Context.set_cipher_list` accepts a :py:obj:`unicode` naming - the ciphers which connections created with the context object will be - able to choose from. - """ - context = Context(TLSv1_METHOD) - context.set_cipher_list(u("hello world:EXP-RC4-MD5")) - conn = Connection(context, None) - self.assertEquals(conn.get_cipher_list(), ["EXP-RC4-MD5"]) - - - def test_set_cipher_list_wrong_args(self): - """ - :py:obj:`Context.set_cipher_list` raises :py:obj:`TypeError` when - passed zero arguments or more than one argument or when passed a - non-string single argument and raises :py:obj:`OpenSSL.SSL.Error` when - passed an incorrect cipher list string. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_cipher_list) - self.assertRaises(TypeError, context.set_cipher_list, object()) - self.assertRaises(TypeError, context.set_cipher_list, b"EXP-RC4-MD5", object()) - - self.assertRaises(Error, context.set_cipher_list, "imaginary-cipher") - - - def test_set_session_cache_mode_wrong_args(self): - """ - :py:obj:`Context.set_session_cache_mode` raises :py:obj:`TypeError` if - called with other than one integer argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_session_cache_mode) - self.assertRaises(TypeError, context.set_session_cache_mode, object()) - - - def test_get_session_cache_mode_wrong_args(self): - """ - :py:obj:`Context.get_session_cache_mode` raises :py:obj:`TypeError` if - called with any arguments. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.get_session_cache_mode, 1) - - - def test_session_cache_mode(self): - """ - :py:obj:`Context.set_session_cache_mode` specifies how sessions are - cached. The setting can be retrieved via - :py:obj:`Context.get_session_cache_mode`. - """ - context = Context(TLSv1_METHOD) - context.set_session_cache_mode(SESS_CACHE_OFF) - off = context.set_session_cache_mode(SESS_CACHE_BOTH) - self.assertEqual(SESS_CACHE_OFF, off) - self.assertEqual(SESS_CACHE_BOTH, context.get_session_cache_mode()) - - if not PY3: - def test_session_cache_mode_long(self): - """ - On Python 2 :py:obj:`Context.set_session_cache_mode` accepts values - of type :py:obj:`long` as well as :py:obj:`int`. - """ - context = Context(TLSv1_METHOD) - context.set_session_cache_mode(long(SESS_CACHE_BOTH)) - self.assertEqual( - SESS_CACHE_BOTH, context.get_session_cache_mode()) - - - def test_get_cert_store(self): - """ - :py:obj:`Context.get_cert_store` returns a :py:obj:`X509Store` instance. - """ - context = Context(TLSv1_METHOD) - store = context.get_cert_store() - self.assertIsInstance(store, X509Store) - - - -class ServerNameCallbackTests(TestCase, _LoopbackMixin): - """ - Tests for :py:obj:`Context.set_tlsext_servername_callback` and its interaction with - :py:obj:`Connection`. - """ - def test_wrong_args(self): - """ - :py:obj:`Context.set_tlsext_servername_callback` raises :py:obj:`TypeError` if called - with other than one argument. - """ - context = Context(TLSv1_METHOD) - self.assertRaises(TypeError, context.set_tlsext_servername_callback) - self.assertRaises( - TypeError, context.set_tlsext_servername_callback, 1, 2) - - - def test_old_callback_forgotten(self): - """ - If :py:obj:`Context.set_tlsext_servername_callback` is used to specify a new - callback, the one it replaces is dereferenced. - """ - def callback(connection): - pass - - def replacement(connection): - pass - - context = Context(TLSv1_METHOD) - context.set_tlsext_servername_callback(callback) - - tracker = ref(callback) - del callback - - context.set_tlsext_servername_callback(replacement) - - # One run of the garbage collector happens to work on CPython. PyPy - # doesn't collect the underlying object until a second run for whatever - # reason. That's fine, it still demonstrates our code has properly - # dropped the reference. - collect() - collect() - - callback = tracker() - if callback is not None: - referrers = get_referrers(callback) - if len(referrers) > 1: - self.fail("Some references remain: %r" % (referrers,)) - - - def test_no_servername(self): - """ - When a client specifies no server name, the callback passed to - :py:obj:`Context.set_tlsext_servername_callback` is invoked and the result of - :py:obj:`Connection.get_servername` is :py:obj:`None`. - """ - args = [] - def servername(conn): - args.append((conn, conn.get_servername())) - context = Context(TLSv1_METHOD) - context.set_tlsext_servername_callback(servername) - - # Lose our reference to it. The Context is responsible for keeping it - # alive now. - del servername - collect() - - # Necessary to actually accept the connection - context.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - context.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - - # Do a little connection to trigger the logic - server = Connection(context, None) - server.set_accept_state() - - client = Connection(Context(TLSv1_METHOD), None) - client.set_connect_state() - - self._interactInMemory(server, client) - - self.assertEqual([(server, None)], args) - - - def test_servername(self): - """ - When a client specifies a server name in its hello message, the callback - passed to :py:obj:`Contexts.set_tlsext_servername_callback` is invoked and the - result of :py:obj:`Connection.get_servername` is that server name. - """ - args = [] - def servername(conn): - args.append((conn, conn.get_servername())) - context = Context(TLSv1_METHOD) - context.set_tlsext_servername_callback(servername) - - # Necessary to actually accept the connection - context.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - context.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - - # Do a little connection to trigger the logic - server = Connection(context, None) - server.set_accept_state() - - client = Connection(Context(TLSv1_METHOD), None) - client.set_connect_state() - client.set_tlsext_host_name(b("foo1.example.com")) - - self._interactInMemory(server, client) - - self.assertEqual([(server, b("foo1.example.com"))], args) - - - -class SessionTests(TestCase): - """ - Unit tests for :py:obj:`OpenSSL.SSL.Session`. - """ - def test_construction(self): - """ - :py:class:`Session` can be constructed with no arguments, creating a new - instance of that type. - """ - new_session = Session() - self.assertTrue(isinstance(new_session, Session)) - - - def test_construction_wrong_args(self): - """ - If any arguments are passed to :py:class:`Session`, :py:obj:`TypeError` - is raised. - """ - self.assertRaises(TypeError, Session, 123) - self.assertRaises(TypeError, Session, "hello") - self.assertRaises(TypeError, Session, object()) - - - -class ConnectionTests(TestCase, _LoopbackMixin): - """ - Unit tests for :py:obj:`OpenSSL.SSL.Connection`. - """ - # XXX get_peer_certificate -> None - # XXX sock_shutdown - # XXX master_key -> TypeError - # XXX server_random -> TypeError - # XXX state_string - # XXX connect -> TypeError - # XXX connect_ex -> TypeError - # XXX set_connect_state -> TypeError - # XXX set_accept_state -> TypeError - # XXX renegotiate_pending - # XXX do_handshake -> TypeError - # XXX bio_read -> TypeError - # XXX recv -> TypeError - # XXX send -> TypeError - # XXX bio_write -> TypeError - - def test_type(self): - """ - :py:obj:`Connection` and :py:obj:`ConnectionType` refer to the same type object and - can be used to create instances of that type. - """ - self.assertIdentical(Connection, ConnectionType) - ctx = Context(TLSv1_METHOD) - self.assertConsistentType(Connection, 'Connection', ctx, None) - - - def test_get_context(self): - """ - :py:obj:`Connection.get_context` returns the :py:obj:`Context` instance used to - construct the :py:obj:`Connection` instance. - """ - context = Context(TLSv1_METHOD) - connection = Connection(context, None) - self.assertIdentical(connection.get_context(), context) - - - def test_get_context_wrong_args(self): - """ - :py:obj:`Connection.get_context` raises :py:obj:`TypeError` if called with any - arguments. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.get_context, None) - - - def test_set_context_wrong_args(self): - """ - :py:obj:`Connection.set_context` raises :py:obj:`TypeError` if called with a - non-:py:obj:`Context` instance argument or with any number of arguments other - than 1. - """ - ctx = Context(TLSv1_METHOD) - connection = Connection(ctx, None) - self.assertRaises(TypeError, connection.set_context) - self.assertRaises(TypeError, connection.set_context, object()) - self.assertRaises(TypeError, connection.set_context, "hello") - self.assertRaises(TypeError, connection.set_context, 1) - self.assertRaises(TypeError, connection.set_context, 1, 2) - self.assertRaises( - TypeError, connection.set_context, Context(TLSv1_METHOD), 2) - self.assertIdentical(ctx, connection.get_context()) - - - def test_set_context(self): - """ - :py:obj:`Connection.set_context` specifies a new :py:obj:`Context` instance to be used - for the connection. - """ - original = Context(SSLv23_METHOD) - replacement = Context(TLSv1_METHOD) - connection = Connection(original, None) - connection.set_context(replacement) - self.assertIdentical(replacement, connection.get_context()) - # Lose our references to the contexts, just in case the Connection isn't - # properly managing its own contributions to their reference counts. - del original, replacement - collect() - - - def test_set_tlsext_host_name_wrong_args(self): - """ - If :py:obj:`Connection.set_tlsext_host_name` is called with a non-byte string - argument or a byte string with an embedded NUL or other than one - argument, :py:obj:`TypeError` is raised. - """ - conn = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, conn.set_tlsext_host_name) - self.assertRaises(TypeError, conn.set_tlsext_host_name, object()) - self.assertRaises(TypeError, conn.set_tlsext_host_name, 123, 456) - self.assertRaises( - TypeError, conn.set_tlsext_host_name, b("with\0null")) - - if version_info >= (3,): - # On Python 3.x, don't accidentally implicitly convert from text. - self.assertRaises( - TypeError, - conn.set_tlsext_host_name, b("example.com").decode("ascii")) - - - def test_get_servername_wrong_args(self): - """ - :py:obj:`Connection.get_servername` raises :py:obj:`TypeError` if called with any - arguments. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.get_servername, object()) - self.assertRaises(TypeError, connection.get_servername, 1) - self.assertRaises(TypeError, connection.get_servername, "hello") - - - def test_pending(self): - """ - :py:obj:`Connection.pending` returns the number of bytes available for - immediate read. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertEquals(connection.pending(), 0) - - - def test_pending_wrong_args(self): - """ - :py:obj:`Connection.pending` raises :py:obj:`TypeError` if called with any arguments. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.pending, None) - - - def test_connect_wrong_args(self): - """ - :py:obj:`Connection.connect` raises :py:obj:`TypeError` if called with a non-address - argument or with the wrong number of arguments. - """ - connection = Connection(Context(TLSv1_METHOD), socket()) - self.assertRaises(TypeError, connection.connect, None) - self.assertRaises(TypeError, connection.connect) - self.assertRaises(TypeError, connection.connect, ("127.0.0.1", 1), None) - - - def test_connect_refused(self): - """ - :py:obj:`Connection.connect` raises :py:obj:`socket.error` if the underlying socket - connect method raises it. - """ - client = socket() - context = Context(TLSv1_METHOD) - clientSSL = Connection(context, client) - exc = self.assertRaises(error, clientSSL.connect, ("127.0.0.1", 1)) - self.assertEquals(exc.args[0], ECONNREFUSED) - - - def test_connect(self): - """ - :py:obj:`Connection.connect` establishes a connection to the specified address. - """ - port = socket() - port.bind(('', 0)) - port.listen(3) - - clientSSL = Connection(Context(TLSv1_METHOD), socket()) - clientSSL.connect(('127.0.0.1', port.getsockname()[1])) - # XXX An assertion? Or something? - - - if platform == "darwin": - "connect_ex sometimes causes a kernel panic on OS X 10.6.4" - else: - def test_connect_ex(self): - """ - If there is a connection error, :py:obj:`Connection.connect_ex` returns the - errno instead of raising an exception. - """ - port = socket() - port.bind(('', 0)) - port.listen(3) - - clientSSL = Connection(Context(TLSv1_METHOD), socket()) - clientSSL.setblocking(False) - result = clientSSL.connect_ex(port.getsockname()) - expected = (EINPROGRESS, EWOULDBLOCK) - self.assertTrue( - result in expected, "%r not in %r" % (result, expected)) - - - def test_accept_wrong_args(self): - """ - :py:obj:`Connection.accept` raises :py:obj:`TypeError` if called with any arguments. - """ - connection = Connection(Context(TLSv1_METHOD), socket()) - self.assertRaises(TypeError, connection.accept, None) - - - def test_accept(self): - """ - :py:obj:`Connection.accept` accepts a pending connection attempt and returns a - tuple of a new :py:obj:`Connection` (the accepted client) and the address the - connection originated from. - """ - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - ctx.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - port = socket() - portSSL = Connection(ctx, port) - portSSL.bind(('', 0)) - portSSL.listen(3) - - clientSSL = Connection(Context(TLSv1_METHOD), socket()) - - # Calling portSSL.getsockname() here to get the server IP address sounds - # great, but frequently fails on Windows. - clientSSL.connect(('127.0.0.1', portSSL.getsockname()[1])) - - serverSSL, address = portSSL.accept() - - self.assertTrue(isinstance(serverSSL, Connection)) - self.assertIdentical(serverSSL.get_context(), ctx) - self.assertEquals(address, clientSSL.getsockname()) - - - def test_shutdown_wrong_args(self): - """ - :py:obj:`Connection.shutdown` raises :py:obj:`TypeError` if called with the wrong - number of arguments or with arguments other than integers. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.shutdown, None) - self.assertRaises(TypeError, connection.get_shutdown, None) - self.assertRaises(TypeError, connection.set_shutdown) - self.assertRaises(TypeError, connection.set_shutdown, None) - self.assertRaises(TypeError, connection.set_shutdown, 0, 1) - - - def test_shutdown(self): - """ - :py:obj:`Connection.shutdown` performs an SSL-level connection shutdown. - """ - server, client = self._loopback() - self.assertFalse(server.shutdown()) - self.assertEquals(server.get_shutdown(), SENT_SHUTDOWN) - self.assertRaises(ZeroReturnError, client.recv, 1024) - self.assertEquals(client.get_shutdown(), RECEIVED_SHUTDOWN) - client.shutdown() - self.assertEquals(client.get_shutdown(), SENT_SHUTDOWN|RECEIVED_SHUTDOWN) - self.assertRaises(ZeroReturnError, server.recv, 1024) - self.assertEquals(server.get_shutdown(), SENT_SHUTDOWN|RECEIVED_SHUTDOWN) - - - def test_set_shutdown(self): - """ - :py:obj:`Connection.set_shutdown` sets the state of the SSL connection shutdown - process. - """ - connection = Connection(Context(TLSv1_METHOD), socket()) - connection.set_shutdown(RECEIVED_SHUTDOWN) - self.assertEquals(connection.get_shutdown(), RECEIVED_SHUTDOWN) - - - if not PY3: - def test_set_shutdown_long(self): - """ - On Python 2 :py:obj:`Connection.set_shutdown` accepts an argument - of type :py:obj:`long` as well as :py:obj:`int`. - """ - connection = Connection(Context(TLSv1_METHOD), socket()) - connection.set_shutdown(long(RECEIVED_SHUTDOWN)) - self.assertEquals(connection.get_shutdown(), RECEIVED_SHUTDOWN) - - - def test_app_data_wrong_args(self): - """ - :py:obj:`Connection.set_app_data` raises :py:obj:`TypeError` if called with other than - one argument. :py:obj:`Connection.get_app_data` raises :py:obj:`TypeError` if called - with any arguments. - """ - conn = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, conn.get_app_data, None) - self.assertRaises(TypeError, conn.set_app_data) - self.assertRaises(TypeError, conn.set_app_data, None, None) - - - def test_app_data(self): - """ - Any object can be set as app data by passing it to - :py:obj:`Connection.set_app_data` and later retrieved with - :py:obj:`Connection.get_app_data`. - """ - conn = Connection(Context(TLSv1_METHOD), None) - app_data = object() - conn.set_app_data(app_data) - self.assertIdentical(conn.get_app_data(), app_data) - - - def test_makefile(self): - """ - :py:obj:`Connection.makefile` is not implemented and calling that method raises - :py:obj:`NotImplementedError`. - """ - conn = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(NotImplementedError, conn.makefile) - - - def test_get_peer_cert_chain_wrong_args(self): - """ - :py:obj:`Connection.get_peer_cert_chain` raises :py:obj:`TypeError` if called with any - arguments. - """ - conn = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, conn.get_peer_cert_chain, 1) - self.assertRaises(TypeError, conn.get_peer_cert_chain, "foo") - self.assertRaises(TypeError, conn.get_peer_cert_chain, object()) - self.assertRaises(TypeError, conn.get_peer_cert_chain, []) - - - def test_get_peer_cert_chain(self): - """ - :py:obj:`Connection.get_peer_cert_chain` returns a list of certificates which - the connected server returned for the certification verification. - """ - chain = _create_certificate_chain() - [(cakey, cacert), (ikey, icert), (skey, scert)] = chain - - serverContext = Context(TLSv1_METHOD) - serverContext.use_privatekey(skey) - serverContext.use_certificate(scert) - serverContext.add_extra_chain_cert(icert) - serverContext.add_extra_chain_cert(cacert) - server = Connection(serverContext, None) - server.set_accept_state() - - # Create the client - clientContext = Context(TLSv1_METHOD) - clientContext.set_verify(VERIFY_NONE, verify_cb) - client = Connection(clientContext, None) - client.set_connect_state() - - self._interactInMemory(client, server) - - chain = client.get_peer_cert_chain() - self.assertEqual(len(chain), 3) - self.assertEqual( - "Server Certificate", chain[0].get_subject().CN) - self.assertEqual( - "Intermediate Certificate", chain[1].get_subject().CN) - self.assertEqual( - "Authority Certificate", chain[2].get_subject().CN) - - - def test_get_peer_cert_chain_none(self): - """ - :py:obj:`Connection.get_peer_cert_chain` returns :py:obj:`None` if the peer sends no - certificate chain. - """ - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - ctx.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - server = Connection(ctx, None) - server.set_accept_state() - client = Connection(Context(TLSv1_METHOD), None) - client.set_connect_state() - self._interactInMemory(client, server) - self.assertIdentical(None, server.get_peer_cert_chain()) - - - def test_get_session_wrong_args(self): - """ - :py:obj:`Connection.get_session` raises :py:obj:`TypeError` if called - with any arguments. - """ - ctx = Context(TLSv1_METHOD) - server = Connection(ctx, None) - self.assertRaises(TypeError, server.get_session, 123) - self.assertRaises(TypeError, server.get_session, "hello") - self.assertRaises(TypeError, server.get_session, object()) - - - def test_get_session_unconnected(self): - """ - :py:obj:`Connection.get_session` returns :py:obj:`None` when used with - an object which has not been connected. - """ - ctx = Context(TLSv1_METHOD) - server = Connection(ctx, None) - session = server.get_session() - self.assertIdentical(None, session) - - - def test_server_get_session(self): - """ - On the server side of a connection, :py:obj:`Connection.get_session` - returns a :py:class:`Session` instance representing the SSL session for - that connection. - """ - server, client = self._loopback() - session = server.get_session() - self.assertIsInstance(session, Session) - - - def test_client_get_session(self): - """ - On the client side of a connection, :py:obj:`Connection.get_session` - returns a :py:class:`Session` instance representing the SSL session for - that connection. - """ - server, client = self._loopback() - session = client.get_session() - self.assertIsInstance(session, Session) - - - def test_set_session_wrong_args(self): - """ - If called with an object that is not an instance of :py:class:`Session`, - or with other than one argument, :py:obj:`Connection.set_session` raises - :py:obj:`TypeError`. - """ - ctx = Context(TLSv1_METHOD) - connection = Connection(ctx, None) - self.assertRaises(TypeError, connection.set_session) - self.assertRaises(TypeError, connection.set_session, 123) - self.assertRaises(TypeError, connection.set_session, "hello") - self.assertRaises(TypeError, connection.set_session, object()) - self.assertRaises( - TypeError, connection.set_session, Session(), Session()) - - - def test_client_set_session(self): - """ - :py:obj:`Connection.set_session`, when used prior to a connection being - established, accepts a :py:class:`Session` instance and causes an - attempt to re-use the session it represents when the SSL handshake is - performed. - """ - key = load_privatekey(FILETYPE_PEM, server_key_pem) - cert = load_certificate(FILETYPE_PEM, server_cert_pem) - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey(key) - ctx.use_certificate(cert) - ctx.set_session_id("unity-test") - - def makeServer(socket): - server = Connection(ctx, socket) - server.set_accept_state() - return server - - originalServer, originalClient = self._loopback( - serverFactory=makeServer) - originalSession = originalClient.get_session() - - def makeClient(socket): - client = self._loopbackClientFactory(socket) - client.set_session(originalSession) - return client - resumedServer, resumedClient = self._loopback( - serverFactory=makeServer, - clientFactory=makeClient) - - # This is a proxy: in general, we have no access to any unique - # identifier for the session (new enough versions of OpenSSL expose a - # hash which could be usable, but "new enough" is very, very new). - # Instead, exploit the fact that the master key is re-used if the - # session is re-used. As long as the master key for the two connections - # is the same, the session was re-used! - self.assertEqual( - originalServer.master_key(), resumedServer.master_key()) - - - def test_set_session_wrong_method(self): - """ - If :py:obj:`Connection.set_session` is passed a :py:class:`Session` - instance associated with a context using a different SSL method than the - :py:obj:`Connection` is using, a :py:class:`OpenSSL.SSL.Error` is - raised. - """ - key = load_privatekey(FILETYPE_PEM, server_key_pem) - cert = load_certificate(FILETYPE_PEM, server_cert_pem) - ctx = Context(TLSv1_METHOD) - ctx.use_privatekey(key) - ctx.use_certificate(cert) - ctx.set_session_id("unity-test") - - def makeServer(socket): - server = Connection(ctx, socket) - server.set_accept_state() - return server - - originalServer, originalClient = self._loopback( - serverFactory=makeServer) - originalSession = originalClient.get_session() - - def makeClient(socket): - # Intentionally use a different, incompatible method here. - client = Connection(Context(SSLv3_METHOD), socket) - client.set_connect_state() - client.set_session(originalSession) - return client - - self.assertRaises( - Error, - self._loopback, clientFactory=makeClient, serverFactory=makeServer) - - - def test_wantWriteError(self): - """ - :py:obj:`Connection` methods which generate output raise - :py:obj:`OpenSSL.SSL.WantWriteError` if writing to the connection's BIO - fail indicating a should-write state. - """ - client_socket, server_socket = socket_pair() - # Fill up the client's send buffer so Connection won't be able to write - # anything. - msg = b"x" * 512 - for i in range(2048): - try: - client_socket.send(msg) - except error as e: - if e.errno == EWOULDBLOCK: - break - raise - else: - self.fail( - "Failed to fill socket buffer, cannot test BIO want write") - - ctx = Context(TLSv1_METHOD) - conn = Connection(ctx, client_socket) - # Client's speak first, so make it an SSL client - conn.set_connect_state() - self.assertRaises(WantWriteError, conn.do_handshake) - - # XXX want_read - - - -class ConnectionGetCipherListTests(TestCase): - """ - Tests for :py:obj:`Connection.get_cipher_list`. - """ - def test_wrong_args(self): - """ - :py:obj:`Connection.get_cipher_list` raises :py:obj:`TypeError` if called with any - arguments. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.get_cipher_list, None) - - - def test_result(self): - """ - :py:obj:`Connection.get_cipher_list` returns a :py:obj:`list` of - :py:obj:`bytes` giving the names of the ciphers which might be used. - """ - connection = Connection(Context(TLSv1_METHOD), None) - ciphers = connection.get_cipher_list() - self.assertTrue(isinstance(ciphers, list)) - for cipher in ciphers: - self.assertTrue(isinstance(cipher, str)) - - - -class ConnectionSendTests(TestCase, _LoopbackMixin): - """ - Tests for :py:obj:`Connection.send` - """ - def test_wrong_args(self): - """ - When called with arguments other than string argument for its first - parameter or more than two arguments, :py:obj:`Connection.send` raises - :py:obj:`TypeError`. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.send) - self.assertRaises(TypeError, connection.send, object()) - self.assertRaises(TypeError, connection.send, "foo", object(), "bar") - - - def test_short_bytes(self): - """ - When passed a short byte string, :py:obj:`Connection.send` transmits all of it - and returns the number of bytes sent. - """ - server, client = self._loopback() - count = server.send(b('xy')) - self.assertEquals(count, 2) - self.assertEquals(client.recv(2), b('xy')) - - try: - memoryview - except NameError: - "cannot test sending memoryview without memoryview" - else: - def test_short_memoryview(self): - """ - When passed a memoryview onto a small number of bytes, - :py:obj:`Connection.send` transmits all of them and returns the number of - bytes sent. - """ - server, client = self._loopback() - count = server.send(memoryview(b('xy'))) - self.assertEquals(count, 2) - self.assertEquals(client.recv(2), b('xy')) - - - -class ConnectionSendallTests(TestCase, _LoopbackMixin): - """ - Tests for :py:obj:`Connection.sendall`. - """ - def test_wrong_args(self): - """ - When called with arguments other than a string argument for its first - parameter or with more than two arguments, :py:obj:`Connection.sendall` - raises :py:obj:`TypeError`. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.sendall) - self.assertRaises(TypeError, connection.sendall, object()) - self.assertRaises( - TypeError, connection.sendall, "foo", object(), "bar") - - - def test_short(self): - """ - :py:obj:`Connection.sendall` transmits all of the bytes in the string passed to - it. - """ - server, client = self._loopback() - server.sendall(b('x')) - self.assertEquals(client.recv(1), b('x')) - - - try: - memoryview - except NameError: - "cannot test sending memoryview without memoryview" - else: - def test_short_memoryview(self): - """ - When passed a memoryview onto a small number of bytes, - :py:obj:`Connection.sendall` transmits all of them. - """ - server, client = self._loopback() - server.sendall(memoryview(b('x'))) - self.assertEquals(client.recv(1), b('x')) - - - def test_long(self): - """ - :py:obj:`Connection.sendall` transmits all of the bytes in the string passed to - it even if this requires multiple calls of an underlying write function. - """ - server, client = self._loopback() - # Should be enough, underlying SSL_write should only do 16k at a time. - # On Windows, after 32k of bytes the write will block (forever - because - # no one is yet reading). - message = b('x') * (1024 * 32 - 1) + b('y') - server.sendall(message) - accum = [] - received = 0 - while received < len(message): - data = client.recv(1024) - accum.append(data) - received += len(data) - self.assertEquals(message, b('').join(accum)) - - - def test_closed(self): - """ - If the underlying socket is closed, :py:obj:`Connection.sendall` propagates the - write error from the low level write call. - """ - server, client = self._loopback() - server.sock_shutdown(2) - exc = self.assertRaises(SysCallError, server.sendall, b"hello, world") - if platform == "win32": - self.assertEqual(exc.args[0], ESHUTDOWN) - else: - self.assertEqual(exc.args[0], EPIPE) - - - -class ConnectionRenegotiateTests(TestCase, _LoopbackMixin): - """ - Tests for SSL renegotiation APIs. - """ - def test_renegotiate_wrong_args(self): - """ - :py:obj:`Connection.renegotiate` raises :py:obj:`TypeError` if called with any - arguments. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.renegotiate, None) - - - def test_total_renegotiations_wrong_args(self): - """ - :py:obj:`Connection.total_renegotiations` raises :py:obj:`TypeError` if called with - any arguments. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertRaises(TypeError, connection.total_renegotiations, None) - - - def test_total_renegotiations(self): - """ - :py:obj:`Connection.total_renegotiations` returns :py:obj:`0` before any - renegotiations have happened. - """ - connection = Connection(Context(TLSv1_METHOD), None) - self.assertEquals(connection.total_renegotiations(), 0) - - -# def test_renegotiate(self): -# """ -# """ -# server, client = self._loopback() - -# server.send("hello world") -# self.assertEquals(client.recv(len("hello world")), "hello world") - -# self.assertEquals(server.total_renegotiations(), 0) -# self.assertTrue(server.renegotiate()) - -# server.setblocking(False) -# client.setblocking(False) -# while server.renegotiate_pending(): -# client.do_handshake() -# server.do_handshake() - -# self.assertEquals(server.total_renegotiations(), 1) - - - - -class ErrorTests(TestCase): - """ - Unit tests for :py:obj:`OpenSSL.SSL.Error`. - """ - def test_type(self): - """ - :py:obj:`Error` is an exception type. - """ - self.assertTrue(issubclass(Error, Exception)) - self.assertEqual(Error.__name__, 'Error') - - - -class ConstantsTests(TestCase): - """ - Tests for the values of constants exposed in :py:obj:`OpenSSL.SSL`. - - These are values defined by OpenSSL intended only to be used as flags to - OpenSSL APIs. The only assertions it seems can be made about them is - their values. - """ - # unittest.TestCase has no skip mechanism - if OP_NO_QUERY_MTU is not None: - def test_op_no_query_mtu(self): - """ - The value of :py:obj:`OpenSSL.SSL.OP_NO_QUERY_MTU` is 0x1000, the value of - :py:const:`SSL_OP_NO_QUERY_MTU` defined by :file:`openssl/ssl.h`. - """ - self.assertEqual(OP_NO_QUERY_MTU, 0x1000) - else: - "OP_NO_QUERY_MTU unavailable - OpenSSL version may be too old" - - - if OP_COOKIE_EXCHANGE is not None: - def test_op_cookie_exchange(self): - """ - The value of :py:obj:`OpenSSL.SSL.OP_COOKIE_EXCHANGE` is 0x2000, the value - of :py:const:`SSL_OP_COOKIE_EXCHANGE` defined by :file:`openssl/ssl.h`. - """ - self.assertEqual(OP_COOKIE_EXCHANGE, 0x2000) - else: - "OP_COOKIE_EXCHANGE unavailable - OpenSSL version may be too old" - - - if OP_NO_TICKET is not None: - def test_op_no_ticket(self): - """ - The value of :py:obj:`OpenSSL.SSL.OP_NO_TICKET` is 0x4000, the value of - :py:const:`SSL_OP_NO_TICKET` defined by :file:`openssl/ssl.h`. - """ - self.assertEqual(OP_NO_TICKET, 0x4000) - else: - "OP_NO_TICKET unavailable - OpenSSL version may be too old" - - - if OP_NO_COMPRESSION is not None: - def test_op_no_compression(self): - """ - The value of :py:obj:`OpenSSL.SSL.OP_NO_COMPRESSION` is 0x20000, the value - of :py:const:`SSL_OP_NO_COMPRESSION` defined by :file:`openssl/ssl.h`. - """ - self.assertEqual(OP_NO_COMPRESSION, 0x20000) - else: - "OP_NO_COMPRESSION unavailable - OpenSSL version may be too old" - - - def test_sess_cache_off(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_OFF` 0x0, the value of - :py:obj:`SSL_SESS_CACHE_OFF` defined by ``openssl/ssl.h``. - """ - self.assertEqual(0x0, SESS_CACHE_OFF) - - - def test_sess_cache_client(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_CLIENT` 0x1, the value of - :py:obj:`SSL_SESS_CACHE_CLIENT` defined by ``openssl/ssl.h``. - """ - self.assertEqual(0x1, SESS_CACHE_CLIENT) - - - def test_sess_cache_server(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_SERVER` 0x2, the value of - :py:obj:`SSL_SESS_CACHE_SERVER` defined by ``openssl/ssl.h``. - """ - self.assertEqual(0x2, SESS_CACHE_SERVER) - - - def test_sess_cache_both(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_BOTH` 0x3, the value of - :py:obj:`SSL_SESS_CACHE_BOTH` defined by ``openssl/ssl.h``. - """ - self.assertEqual(0x3, SESS_CACHE_BOTH) - - - def test_sess_cache_no_auto_clear(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_NO_AUTO_CLEAR` 0x80, the - value of :py:obj:`SSL_SESS_CACHE_NO_AUTO_CLEAR` defined by - ``openssl/ssl.h``. - """ - self.assertEqual(0x80, SESS_CACHE_NO_AUTO_CLEAR) - - - def test_sess_cache_no_internal_lookup(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_NO_INTERNAL_LOOKUP` 0x100, - the value of :py:obj:`SSL_SESS_CACHE_NO_INTERNAL_LOOKUP` defined by - ``openssl/ssl.h``. - """ - self.assertEqual(0x100, SESS_CACHE_NO_INTERNAL_LOOKUP) - - - def test_sess_cache_no_internal_store(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_NO_INTERNAL_STORE` 0x200, - the value of :py:obj:`SSL_SESS_CACHE_NO_INTERNAL_STORE` defined by - ``openssl/ssl.h``. - """ - self.assertEqual(0x200, SESS_CACHE_NO_INTERNAL_STORE) - - - def test_sess_cache_no_internal(self): - """ - The value of :py:obj:`OpenSSL.SSL.SESS_CACHE_NO_INTERNAL` 0x300, the - value of :py:obj:`SSL_SESS_CACHE_NO_INTERNAL` defined by - ``openssl/ssl.h``. - """ - self.assertEqual(0x300, SESS_CACHE_NO_INTERNAL) - - - -class MemoryBIOTests(TestCase, _LoopbackMixin): - """ - Tests for :py:obj:`OpenSSL.SSL.Connection` using a memory BIO. - """ - def _server(self, sock): - """ - Create a new server-side SSL :py:obj:`Connection` object wrapped around - :py:obj:`sock`. - """ - # Create the server side Connection. This is mostly setup boilerplate - # - use TLSv1, use a particular certificate, etc. - server_ctx = Context(TLSv1_METHOD) - server_ctx.set_options(OP_NO_SSLv2 | OP_NO_SSLv3 | OP_SINGLE_DH_USE ) - server_ctx.set_verify(VERIFY_PEER|VERIFY_FAIL_IF_NO_PEER_CERT|VERIFY_CLIENT_ONCE, verify_cb) - server_store = server_ctx.get_cert_store() - server_ctx.use_privatekey(load_privatekey(FILETYPE_PEM, server_key_pem)) - server_ctx.use_certificate(load_certificate(FILETYPE_PEM, server_cert_pem)) - server_ctx.check_privatekey() - server_store.add_cert(load_certificate(FILETYPE_PEM, root_cert_pem)) - # Here the Connection is actually created. If None is passed as the 2nd - # parameter, it indicates a memory BIO should be created. - server_conn = Connection(server_ctx, sock) - server_conn.set_accept_state() - return server_conn - - - def _client(self, sock): - """ - Create a new client-side SSL :py:obj:`Connection` object wrapped around - :py:obj:`sock`. - """ - # Now create the client side Connection. Similar boilerplate to the - # above. - client_ctx = Context(TLSv1_METHOD) - client_ctx.set_options(OP_NO_SSLv2 | OP_NO_SSLv3 | OP_SINGLE_DH_USE ) - client_ctx.set_verify(VERIFY_PEER|VERIFY_FAIL_IF_NO_PEER_CERT|VERIFY_CLIENT_ONCE, verify_cb) - client_store = client_ctx.get_cert_store() - client_ctx.use_privatekey(load_privatekey(FILETYPE_PEM, client_key_pem)) - client_ctx.use_certificate(load_certificate(FILETYPE_PEM, client_cert_pem)) - client_ctx.check_privatekey() - client_store.add_cert(load_certificate(FILETYPE_PEM, root_cert_pem)) - client_conn = Connection(client_ctx, sock) - client_conn.set_connect_state() - return client_conn - - - def test_memoryConnect(self): - """ - Two :py:obj:`Connection`s which use memory BIOs can be manually connected by - reading from the output of each and writing those bytes to the input of - the other and in this way establish a connection and exchange - application-level bytes with each other. - """ - server_conn = self._server(None) - client_conn = self._client(None) - - # There should be no key or nonces yet. - self.assertIdentical(server_conn.master_key(), None) - self.assertIdentical(server_conn.client_random(), None) - self.assertIdentical(server_conn.server_random(), None) - - # First, the handshake needs to happen. We'll deliver bytes back and - # forth between the client and server until neither of them feels like - # speaking any more. - self.assertIdentical( - self._interactInMemory(client_conn, server_conn), None) - - # Now that the handshake is done, there should be a key and nonces. - self.assertNotIdentical(server_conn.master_key(), None) - self.assertNotIdentical(server_conn.client_random(), None) - self.assertNotIdentical(server_conn.server_random(), None) - self.assertEquals(server_conn.client_random(), client_conn.client_random()) - self.assertEquals(server_conn.server_random(), client_conn.server_random()) - self.assertNotEquals(server_conn.client_random(), server_conn.server_random()) - self.assertNotEquals(client_conn.client_random(), client_conn.server_random()) - - # Here are the bytes we'll try to send. - important_message = b('One if by land, two if by sea.') - - server_conn.write(important_message) - self.assertEquals( - self._interactInMemory(client_conn, server_conn), - (client_conn, important_message)) - - client_conn.write(important_message[::-1]) - self.assertEquals( - self._interactInMemory(client_conn, server_conn), - (server_conn, important_message[::-1])) - - - def test_socketConnect(self): - """ - Just like :py:obj:`test_memoryConnect` but with an actual socket. - - This is primarily to rule out the memory BIO code as the source of - any problems encountered while passing data over a :py:obj:`Connection` (if - this test fails, there must be a problem outside the memory BIO - code, as no memory BIO is involved here). Even though this isn't a - memory BIO test, it's convenient to have it here. - """ - server_conn, client_conn = self._loopback() - - important_message = b("Help me Obi Wan Kenobi, you're my only hope.") - client_conn.send(important_message) - msg = server_conn.recv(1024) - self.assertEqual(msg, important_message) - - # Again in the other direction, just for fun. - important_message = important_message[::-1] - server_conn.send(important_message) - msg = client_conn.recv(1024) - self.assertEqual(msg, important_message) - - - def test_socketOverridesMemory(self): - """ - Test that :py:obj:`OpenSSL.SSL.bio_read` and :py:obj:`OpenSSL.SSL.bio_write` don't - work on :py:obj:`OpenSSL.SSL.Connection`() that use sockets. - """ - context = Context(SSLv3_METHOD) - client = socket() - clientSSL = Connection(context, client) - self.assertRaises( TypeError, clientSSL.bio_read, 100) - self.assertRaises( TypeError, clientSSL.bio_write, "foo") - self.assertRaises( TypeError, clientSSL.bio_shutdown ) - - - def test_outgoingOverflow(self): - """ - If more bytes than can be written to the memory BIO are passed to - :py:obj:`Connection.send` at once, the number of bytes which were written is - returned and that many bytes from the beginning of the input can be - read from the other end of the connection. - """ - server = self._server(None) - client = self._client(None) - - self._interactInMemory(client, server) - - size = 2 ** 15 - sent = client.send(b"x" * size) - # Sanity check. We're trying to test what happens when the entire - # input can't be sent. If the entire input was sent, this test is - # meaningless. - self.assertTrue(sent < size) - - receiver, received = self._interactInMemory(client, server) - self.assertIdentical(receiver, server) - - # We can rely on all of these bytes being received at once because - # _loopback passes 2 ** 16 to recv - more than 2 ** 15. - self.assertEquals(len(received), sent) - - - def test_shutdown(self): - """ - :py:obj:`Connection.bio_shutdown` signals the end of the data stream from - which the :py:obj:`Connection` reads. - """ - server = self._server(None) - server.bio_shutdown() - e = self.assertRaises(Error, server.recv, 1024) - # We don't want WantReadError or ZeroReturnError or anything - it's a - # handshake failure. - self.assertEquals(e.__class__, Error) - - - def test_unexpectedEndOfFile(self): - """ - If the connection is lost before an orderly SSL shutdown occurs, - :py:obj:`OpenSSL.SSL.SysCallError` is raised with a message of - "Unexpected EOF". - """ - server_conn, client_conn = self._loopback() - client_conn.sock_shutdown(SHUT_RDWR) - exc = self.assertRaises(SysCallError, server_conn.recv, 1024) - self.assertEqual(exc.args, (-1, "Unexpected EOF")) - - - def _check_client_ca_list(self, func): - """ - Verify the return value of the :py:obj:`get_client_ca_list` method for server and client connections. - - :param func: A function which will be called with the server context - before the client and server are connected to each other. This - function should specify a list of CAs for the server to send to the - client and return that same list. The list will be used to verify - that :py:obj:`get_client_ca_list` returns the proper value at various - times. - """ - server = self._server(None) - client = self._client(None) - self.assertEqual(client.get_client_ca_list(), []) - self.assertEqual(server.get_client_ca_list(), []) - ctx = server.get_context() - expected = func(ctx) - self.assertEqual(client.get_client_ca_list(), []) - self.assertEqual(server.get_client_ca_list(), expected) - self._interactInMemory(client, server) - self.assertEqual(client.get_client_ca_list(), expected) - self.assertEqual(server.get_client_ca_list(), expected) - - - def test_set_client_ca_list_errors(self): - """ - :py:obj:`Context.set_client_ca_list` raises a :py:obj:`TypeError` if called with a - non-list or a list that contains objects other than X509Names. - """ - ctx = Context(TLSv1_METHOD) - self.assertRaises(TypeError, ctx.set_client_ca_list, "spam") - self.assertRaises(TypeError, ctx.set_client_ca_list, ["spam"]) - self.assertIdentical(ctx.set_client_ca_list([]), None) - - - def test_set_empty_ca_list(self): - """ - If passed an empty list, :py:obj:`Context.set_client_ca_list` configures the - context to send no CA names to the client and, on both the server and - client sides, :py:obj:`Connection.get_client_ca_list` returns an empty list - after the connection is set up. - """ - def no_ca(ctx): - ctx.set_client_ca_list([]) - return [] - self._check_client_ca_list(no_ca) - - - def test_set_one_ca_list(self): - """ - If passed a list containing a single X509Name, - :py:obj:`Context.set_client_ca_list` configures the context to send that CA - name to the client and, on both the server and client sides, - :py:obj:`Connection.get_client_ca_list` returns a list containing that - X509Name after the connection is set up. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - cadesc = cacert.get_subject() - def single_ca(ctx): - ctx.set_client_ca_list([cadesc]) - return [cadesc] - self._check_client_ca_list(single_ca) - - - def test_set_multiple_ca_list(self): - """ - If passed a list containing multiple X509Name objects, - :py:obj:`Context.set_client_ca_list` configures the context to send those CA - names to the client and, on both the server and client sides, - :py:obj:`Connection.get_client_ca_list` returns a list containing those - X509Names after the connection is set up. - """ - secert = load_certificate(FILETYPE_PEM, server_cert_pem) - clcert = load_certificate(FILETYPE_PEM, server_cert_pem) - - sedesc = secert.get_subject() - cldesc = clcert.get_subject() - - def multiple_ca(ctx): - L = [sedesc, cldesc] - ctx.set_client_ca_list(L) - return L - self._check_client_ca_list(multiple_ca) - - - def test_reset_ca_list(self): - """ - If called multiple times, only the X509Names passed to the final call - of :py:obj:`Context.set_client_ca_list` are used to configure the CA names - sent to the client. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - secert = load_certificate(FILETYPE_PEM, server_cert_pem) - clcert = load_certificate(FILETYPE_PEM, server_cert_pem) - - cadesc = cacert.get_subject() - sedesc = secert.get_subject() - cldesc = clcert.get_subject() - - def changed_ca(ctx): - ctx.set_client_ca_list([sedesc, cldesc]) - ctx.set_client_ca_list([cadesc]) - return [cadesc] - self._check_client_ca_list(changed_ca) - - - def test_mutated_ca_list(self): - """ - If the list passed to :py:obj:`Context.set_client_ca_list` is mutated - afterwards, this does not affect the list of CA names sent to the - client. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - secert = load_certificate(FILETYPE_PEM, server_cert_pem) - - cadesc = cacert.get_subject() - sedesc = secert.get_subject() - - def mutated_ca(ctx): - L = [cadesc] - ctx.set_client_ca_list([cadesc]) - L.append(sedesc) - return [cadesc] - self._check_client_ca_list(mutated_ca) - - - def test_add_client_ca_errors(self): - """ - :py:obj:`Context.add_client_ca` raises :py:obj:`TypeError` if called with a non-X509 - object or with a number of arguments other than one. - """ - ctx = Context(TLSv1_METHOD) - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - self.assertRaises(TypeError, ctx.add_client_ca) - self.assertRaises(TypeError, ctx.add_client_ca, "spam") - self.assertRaises(TypeError, ctx.add_client_ca, cacert, cacert) - - - def test_one_add_client_ca(self): - """ - A certificate's subject can be added as a CA to be sent to the client - with :py:obj:`Context.add_client_ca`. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - cadesc = cacert.get_subject() - def single_ca(ctx): - ctx.add_client_ca(cacert) - return [cadesc] - self._check_client_ca_list(single_ca) - - - def test_multiple_add_client_ca(self): - """ - Multiple CA names can be sent to the client by calling - :py:obj:`Context.add_client_ca` with multiple X509 objects. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - secert = load_certificate(FILETYPE_PEM, server_cert_pem) - - cadesc = cacert.get_subject() - sedesc = secert.get_subject() - - def multiple_ca(ctx): - ctx.add_client_ca(cacert) - ctx.add_client_ca(secert) - return [cadesc, sedesc] - self._check_client_ca_list(multiple_ca) - - - def test_set_and_add_client_ca(self): - """ - A call to :py:obj:`Context.set_client_ca_list` followed by a call to - :py:obj:`Context.add_client_ca` results in using the CA names from the first - call and the CA name from the second call. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - secert = load_certificate(FILETYPE_PEM, server_cert_pem) - clcert = load_certificate(FILETYPE_PEM, server_cert_pem) - - cadesc = cacert.get_subject() - sedesc = secert.get_subject() - cldesc = clcert.get_subject() - - def mixed_set_add_ca(ctx): - ctx.set_client_ca_list([cadesc, sedesc]) - ctx.add_client_ca(clcert) - return [cadesc, sedesc, cldesc] - self._check_client_ca_list(mixed_set_add_ca) - - - def test_set_after_add_client_ca(self): - """ - A call to :py:obj:`Context.set_client_ca_list` after a call to - :py:obj:`Context.add_client_ca` replaces the CA name specified by the former - call with the names specified by the latter cal. - """ - cacert = load_certificate(FILETYPE_PEM, root_cert_pem) - secert = load_certificate(FILETYPE_PEM, server_cert_pem) - clcert = load_certificate(FILETYPE_PEM, server_cert_pem) - - cadesc = cacert.get_subject() - sedesc = secert.get_subject() - - def set_replaces_add_ca(ctx): - ctx.add_client_ca(clcert) - ctx.set_client_ca_list([cadesc]) - ctx.add_client_ca(secert) - return [cadesc, sedesc] - self._check_client_ca_list(set_replaces_add_ca) - - - -class ConnectionBIOTests(TestCase): - """ - Tests for :py:obj:`Connection.bio_read` and :py:obj:`Connection.bio_write`. - """ - def test_wantReadError(self): - """ - :py:obj:`Connection.bio_read` raises :py:obj:`OpenSSL.SSL.WantReadError` - if there are no bytes available to be read from the BIO. - """ - ctx = Context(TLSv1_METHOD) - conn = Connection(ctx, None) - self.assertRaises(WantReadError, conn.bio_read, 1024) - - - def test_buffer_size(self): - """ - :py:obj:`Connection.bio_read` accepts an integer giving the maximum - number of bytes to read and return. - """ - ctx = Context(TLSv1_METHOD) - conn = Connection(ctx, None) - conn.set_connect_state() - try: - conn.do_handshake() - except WantReadError: - pass - data = conn.bio_read(2) - self.assertEqual(2, len(data)) - - - if not PY3: - def test_buffer_size_long(self): - """ - On Python 2 :py:obj:`Connection.bio_read` accepts values of type - :py:obj:`long` as well as :py:obj:`int`. - """ - ctx = Context(TLSv1_METHOD) - conn = Connection(ctx, None) - conn.set_connect_state() - try: - conn.do_handshake() - except WantReadError: - pass - data = conn.bio_read(long(2)) - self.assertEqual(2, len(data)) - - - - -class InfoConstantTests(TestCase): - """ - Tests for assorted constants exposed for use in info callbacks. - """ - def test_integers(self): - """ - All of the info constants are integers. - - This is a very weak test. It would be nice to have one that actually - verifies that as certain info events happen, the value passed to the - info callback matches up with the constant exposed by OpenSSL.SSL. - """ - for const in [ - SSL_ST_CONNECT, SSL_ST_ACCEPT, SSL_ST_MASK, SSL_ST_INIT, - SSL_ST_BEFORE, SSL_ST_OK, SSL_ST_RENEGOTIATE, - SSL_CB_LOOP, SSL_CB_EXIT, SSL_CB_READ, SSL_CB_WRITE, SSL_CB_ALERT, - SSL_CB_READ_ALERT, SSL_CB_WRITE_ALERT, SSL_CB_ACCEPT_LOOP, - SSL_CB_ACCEPT_EXIT, SSL_CB_CONNECT_LOOP, SSL_CB_CONNECT_EXIT, - SSL_CB_HANDSHAKE_START, SSL_CB_HANDSHAKE_DONE]: - - self.assertTrue(isinstance(const, int)) - - -if __name__ == '__main__': - main() diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/util.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/util.py deleted file mode 100644 index 4e4d812..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/test/util.py +++ /dev/null @@ -1,302 +0,0 @@ -# Copyright (C) Jean-Paul Calderone -# Copyright (C) Twisted Matrix Laboratories. -# See LICENSE for details. - -""" -Helpers for the OpenSSL test suite, largely copied from -U{Twisted}. -""" - -import shutil -import traceback -import os, os.path -from tempfile import mktemp -from unittest import TestCase -import sys - -from OpenSSL._util import exception_from_error_queue -from OpenSSL.crypto import Error - -try: - import memdbg -except Exception: - class _memdbg(object): heap = None - memdbg = _memdbg() - -from OpenSSL._util import ffi, lib, byte_string as b - -class TestCase(TestCase): - """ - :py:class:`TestCase` adds useful testing functionality beyond what is available - from the standard library :py:class:`unittest.TestCase`. - """ - def run(self, result): - run = super(TestCase, self).run - if memdbg.heap is None: - return run(result) - - # Run the test as usual - before = set(memdbg.heap) - run(result) - - # Clean up some long-lived allocations so they won't be reported as - # memory leaks. - lib.CRYPTO_cleanup_all_ex_data() - lib.ERR_remove_thread_state(ffi.NULL) - after = set(memdbg.heap) - - if not after - before: - # No leaks, fast succeed - return - - if result.wasSuccessful(): - # If it passed, run it again with memory debugging - before = set(memdbg.heap) - run(result) - - # Clean up some long-lived allocations so they won't be reported as - # memory leaks. - lib.CRYPTO_cleanup_all_ex_data() - lib.ERR_remove_thread_state(ffi.NULL) - - after = set(memdbg.heap) - - self._reportLeaks(after - before, result) - - - def _reportLeaks(self, leaks, result): - def format_leak(p): - stacks = memdbg.heap[p] - # Eventually look at multiple stacks for the realloc() case. For - # now just look at the original allocation location. - (size, python_stack, c_stack) = stacks[0] - - stack = traceback.format_list(python_stack)[:-1] - - # c_stack looks something like this (interesting parts indicated - # with inserted arrows not part of the data): - # - # /home/exarkun/Projects/pyOpenSSL/branches/use-opentls/__pycache__/_cffi__x89095113xb9185b9b.so(+0x12cf) [0x7fe2e20582cf] - # /home/exarkun/Projects/cpython/2.7/python(PyCFunction_Call+0x8b) [0x56265a] - # /home/exarkun/Projects/cpython/2.7/python() [0x4d5f52] - # /home/exarkun/Projects/cpython/2.7/python(PyEval_EvalFrameEx+0x753b) [0x4d0e1e] - # /home/exarkun/Projects/cpython/2.7/python() [0x4d6419] - # /home/exarkun/Projects/cpython/2.7/python() [0x4d6129] - # /home/exarkun/Projects/cpython/2.7/python(PyEval_EvalFrameEx+0x753b) [0x4d0e1e] - # /home/exarkun/Projects/cpython/2.7/python(PyEval_EvalCodeEx+0x1043) [0x4d3726] - # /home/exarkun/Projects/cpython/2.7/python() [0x55fd51] - # /home/exarkun/Projects/cpython/2.7/python(PyObject_Call+0x7e) [0x420ee6] - # /home/exarkun/Projects/cpython/2.7/python(PyEval_CallObjectWithKeywords+0x158) [0x4d56ec] - # /home/exarkun/.local/lib/python2.7/site-packages/cffi-0.5-py2.7-linux-x86_64.egg/_cffi_backend.so(+0xe96e) [0x7fe2e38be96e] - # /usr/lib/x86_64-linux-gnu/libffi.so.6(ffi_closure_unix64_inner+0x1b9) [0x7fe2e36ad819] - # /usr/lib/x86_64-linux-gnu/libffi.so.6(ffi_closure_unix64+0x46) [0x7fe2e36adb7c] - # /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(CRYPTO_malloc+0x64) [0x7fe2e1cef784] <------ end interesting - # /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(lh_insert+0x16b) [0x7fe2e1d6a24b] . - # /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(+0x61c18) [0x7fe2e1cf0c18] . - # /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(+0x625ec) [0x7fe2e1cf15ec] . - # /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(DSA_new_method+0xe6) [0x7fe2e1d524d6] . - # /lib/x86_64-linux-gnu/libcrypto.so.1.0.0(DSA_generate_parameters+0x3a) [0x7fe2e1d5364a] <------ begin interesting - # /home/exarkun/Projects/opentls/trunk/tls/c/__pycache__/_cffi__x305d4698xb539baaa.so(+0x1f397) [0x7fe2df84d397] - # /home/exarkun/Projects/cpython/2.7/python(PyCFunction_Call+0x8b) [0x56265a] - # /home/exarkun/Projects/cpython/2.7/python() [0x4d5f52] - # /home/exarkun/Projects/cpython/2.7/python(PyEval_EvalFrameEx+0x753b) [0x4d0e1e] - # /home/exarkun/Projects/cpython/2.7/python() [0x4d6419] - # ... - # - # Notice the stack is upside down compared to a Python traceback. - # Identify the start and end of interesting bits and stuff it into the stack we report. - - saved = list(c_stack) - - # Figure the first interesting frame will be after a the cffi-compiled module - while c_stack and '/__pycache__/_cffi__' not in c_stack[-1]: - c_stack.pop() - - # Figure the last interesting frame will always be CRYPTO_malloc, - # since that's where we hooked in to things. - while c_stack and 'CRYPTO_malloc' not in c_stack[0] and 'CRYPTO_realloc' not in c_stack[0]: - c_stack.pop(0) - - if c_stack: - c_stack.reverse() - else: - c_stack = saved[::-1] - stack.extend([frame + "\n" for frame in c_stack]) - - stack.insert(0, "Leaked (%s) at:\n") - return "".join(stack) - - if leaks: - unique_leaks = {} - for p in leaks: - size = memdbg.heap[p][-1][0] - new_leak = format_leak(p) - if new_leak not in unique_leaks: - unique_leaks[new_leak] = [(size, p)] - else: - unique_leaks[new_leak].append((size, p)) - memdbg.free(p) - - for (stack, allocs) in unique_leaks.iteritems(): - allocs_accum = [] - for (size, pointer) in allocs: - - addr = int(ffi.cast('uintptr_t', pointer)) - allocs_accum.append("%d@0x%x" % (size, addr)) - allocs_report = ", ".join(sorted(allocs_accum)) - - result.addError( - self, - (None, Exception(stack % (allocs_report,)), None)) - - - def tearDown(self): - """ - Clean up any files or directories created using :py:meth:`TestCase.mktemp`. - Subclasses must invoke this method if they override it or the - cleanup will not occur. - """ - if False and self._temporaryFiles is not None: - for temp in self._temporaryFiles: - if os.path.isdir(temp): - shutil.rmtree(temp) - elif os.path.exists(temp): - os.unlink(temp) - try: - exception_from_error_queue(Error) - except Error: - e = sys.exc_info()[1] - if e.args != ([],): - self.fail("Left over errors in OpenSSL error queue: " + repr(e)) - - - def assertIsInstance(self, instance, classOrTuple, message=None): - """ - Fail if C{instance} is not an instance of the given class or of - one of the given classes. - - @param instance: the object to test the type (first argument of the - C{isinstance} call). - @type instance: any. - @param classOrTuple: the class or classes to test against (second - argument of the C{isinstance} call). - @type classOrTuple: class, type, or tuple. - - @param message: Custom text to include in the exception text if the - assertion fails. - """ - if not isinstance(instance, classOrTuple): - if message is None: - suffix = "" - else: - suffix = ": " + message - self.fail("%r is not an instance of %s%s" % ( - instance, classOrTuple, suffix)) - - - def failUnlessIn(self, containee, container, msg=None): - """ - Fail the test if :py:data:`containee` is not found in :py:data:`container`. - - :param containee: the value that should be in :py:class:`container` - :param container: a sequence type, or in the case of a mapping type, - will follow semantics of 'if key in dict.keys()' - :param msg: if msg is None, then the failure message will be - '%r not in %r' % (first, second) - """ - if containee not in container: - raise self.failureException(msg or "%r not in %r" - % (containee, container)) - return containee - assertIn = failUnlessIn - - def failUnlessIdentical(self, first, second, msg=None): - """ - Fail the test if :py:data:`first` is not :py:data:`second`. This is an - obect-identity-equality test, not an object equality - (i.e. :py:func:`__eq__`) test. - - :param msg: if msg is None, then the failure message will be - '%r is not %r' % (first, second) - """ - if first is not second: - raise self.failureException(msg or '%r is not %r' % (first, second)) - return first - assertIdentical = failUnlessIdentical - - - def failIfIdentical(self, first, second, msg=None): - """ - Fail the test if :py:data:`first` is :py:data:`second`. This is an - obect-identity-equality test, not an object equality - (i.e. :py:func:`__eq__`) test. - - :param msg: if msg is None, then the failure message will be - '%r is %r' % (first, second) - """ - if first is second: - raise self.failureException(msg or '%r is %r' % (first, second)) - return first - assertNotIdentical = failIfIdentical - - - def failUnlessRaises(self, exception, f, *args, **kwargs): - """ - Fail the test unless calling the function :py:data:`f` with the given - :py:data:`args` and :py:data:`kwargs` raises :py:data:`exception`. The - failure will report the traceback and call stack of the unexpected - exception. - - :param exception: exception type that is to be expected - :param f: the function to call - - :return: The raised exception instance, if it is of the given type. - :raise self.failureException: Raised if the function call does - not raise an exception or if it raises an exception of a - different type. - """ - try: - result = f(*args, **kwargs) - except exception: - inst = sys.exc_info()[1] - return inst - except: - raise self.failureException('%s raised instead of %s' - % (sys.exc_info()[0], - exception.__name__, - )) - else: - raise self.failureException('%s not raised (%r returned)' - % (exception.__name__, result)) - assertRaises = failUnlessRaises - - - _temporaryFiles = None - def mktemp(self): - """ - Pathetic substitute for twisted.trial.unittest.TestCase.mktemp. - """ - if self._temporaryFiles is None: - self._temporaryFiles = [] - temp = b(mktemp(dir=".")) - self._temporaryFiles.append(temp) - return temp - - - # Other stuff - def assertConsistentType(self, theType, name, *constructionArgs): - """ - Perform various assertions about :py:data:`theType` to ensure that it is a - well-defined type. This is useful for extension types, where it's - pretty easy to do something wacky. If something about the type is - unusual, an exception will be raised. - - :param theType: The type object about which to make assertions. - :param name: A string giving the name of the type. - :param constructionArgs: Positional arguments to use with :py:data:`theType` to - create an instance of it. - """ - self.assertEqual(theType.__name__, name) - self.assertTrue(isinstance(theType, type)) - instance = theType(*constructionArgs) - self.assertIdentical(type(instance), theType) diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/tsafe.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/tsafe.py deleted file mode 100644 index 9d7ad2f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/tsafe.py +++ /dev/null @@ -1,28 +0,0 @@ -from OpenSSL import SSL -_ssl = SSL -del SSL - -import threading -_RLock = threading.RLock -del threading - -class Connection: - def __init__(self, *args): - self._ssl_conn = apply(_ssl.Connection, args) - self._lock = _RLock() - - for f in ('get_context', 'pending', 'send', 'write', 'recv', 'read', - 'renegotiate', 'bind', 'listen', 'connect', 'accept', - 'setblocking', 'fileno', 'shutdown', 'close', 'get_cipher_list', - 'getpeername', 'getsockname', 'getsockopt', 'setsockopt', - 'makefile', 'get_app_data', 'set_app_data', 'state_string', - 'sock_shutdown', 'get_peer_certificate', 'get_peer_cert_chain', 'want_read', - 'want_write', 'set_connect_state', 'set_accept_state', - 'connect_ex', 'sendall'): - exec("""def %s(self, *args): - self._lock.acquire() - try: - return self._ssl_conn.%s(*args) - finally: - self._lock.release()\n""" % (f, f)) - diff --git a/Linux_i686/lib/python3.4/site-packages/OpenSSL/version.py b/Linux_i686/lib/python3.4/site-packages/OpenSSL/version.py deleted file mode 100644 index 307dba0..0000000 --- a/Linux_i686/lib/python3.4/site-packages/OpenSSL/version.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (C) AB Strakt -# Copyright (C) Jean-Paul Calderone -# See LICENSE for details. - -""" -pyOpenSSL - A simple wrapper around the OpenSSL library -""" - -__version__ = '0.14' diff --git a/Linux_i686/lib/python3.4/site-packages/SQLAlchemy-0.9.7.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/SQLAlchemy-0.9.7.egg-info/installed-files.txt index 9ee9b77..48565ed 100644 --- a/Linux_i686/lib/python3.4/site-packages/SQLAlchemy-0.9.7.egg-info/installed-files.txt +++ b/Linux_i686/lib/python3.4/site-packages/SQLAlchemy-0.9.7.egg-info/installed-files.txt @@ -1,366 +1,366 @@ -../sqlalchemy/interfaces.py -../sqlalchemy/events.py -../sqlalchemy/types.py -../sqlalchemy/exc.py -../sqlalchemy/schema.py -../sqlalchemy/inspection.py -../sqlalchemy/__init__.py -../sqlalchemy/pool.py -../sqlalchemy/processors.py ../sqlalchemy/log.py -../sqlalchemy/databases/__init__.py -../sqlalchemy/testing/engines.py -../sqlalchemy/testing/schema.py -../sqlalchemy/testing/pickleable.py -../sqlalchemy/testing/fixtures.py -../sqlalchemy/testing/__init__.py -../sqlalchemy/testing/assertsql.py -../sqlalchemy/testing/config.py -../sqlalchemy/testing/warnings.py -../sqlalchemy/testing/distutils_run.py -../sqlalchemy/testing/requirements.py -../sqlalchemy/testing/runner.py -../sqlalchemy/testing/assertions.py -../sqlalchemy/testing/profiling.py -../sqlalchemy/testing/mock.py -../sqlalchemy/testing/exclusions.py -../sqlalchemy/testing/util.py -../sqlalchemy/testing/entities.py -../sqlalchemy/testing/plugin/noseplugin.py -../sqlalchemy/testing/plugin/__init__.py -../sqlalchemy/testing/plugin/pytestplugin.py -../sqlalchemy/testing/plugin/plugin_base.py -../sqlalchemy/testing/suite/test_insert.py -../sqlalchemy/testing/suite/test_results.py -../sqlalchemy/testing/suite/__init__.py -../sqlalchemy/testing/suite/test_select.py -../sqlalchemy/testing/suite/test_sequence.py -../sqlalchemy/testing/suite/test_types.py -../sqlalchemy/testing/suite/test_update_delete.py -../sqlalchemy/testing/suite/test_reflection.py -../sqlalchemy/testing/suite/test_ddl.py -../sqlalchemy/orm/persistence.py -../sqlalchemy/orm/interfaces.py -../sqlalchemy/orm/events.py -../sqlalchemy/orm/path_registry.py -../sqlalchemy/orm/descriptor_props.py -../sqlalchemy/orm/identity.py -../sqlalchemy/orm/evaluator.py -../sqlalchemy/orm/exc.py -../sqlalchemy/orm/base.py -../sqlalchemy/orm/__init__.py -../sqlalchemy/orm/properties.py -../sqlalchemy/orm/relationships.py -../sqlalchemy/orm/collections.py -../sqlalchemy/orm/strategy_options.py -../sqlalchemy/orm/dynamic.py -../sqlalchemy/orm/attributes.py -../sqlalchemy/orm/mapper.py -../sqlalchemy/orm/state.py -../sqlalchemy/orm/sync.py -../sqlalchemy/orm/loading.py -../sqlalchemy/orm/strategies.py -../sqlalchemy/orm/unitofwork.py -../sqlalchemy/orm/query.py -../sqlalchemy/orm/instrumentation.py -../sqlalchemy/orm/session.py -../sqlalchemy/orm/deprecated_interfaces.py -../sqlalchemy/orm/scoping.py -../sqlalchemy/orm/dependency.py -../sqlalchemy/orm/util.py -../sqlalchemy/sql/default_comparator.py -../sqlalchemy/sql/sqltypes.py -../sqlalchemy/sql/functions.py -../sqlalchemy/sql/base.py -../sqlalchemy/sql/schema.py -../sqlalchemy/sql/__init__.py -../sqlalchemy/sql/ddl.py -../sqlalchemy/sql/elements.py -../sqlalchemy/sql/compiler.py -../sqlalchemy/sql/annotation.py -../sqlalchemy/sql/dml.py -../sqlalchemy/sql/expression.py -../sqlalchemy/sql/operators.py -../sqlalchemy/sql/selectable.py -../sqlalchemy/sql/visitors.py -../sqlalchemy/sql/type_api.py -../sqlalchemy/sql/naming.py -../sqlalchemy/sql/util.py -../sqlalchemy/ext/serializer.py -../sqlalchemy/ext/associationproxy.py -../sqlalchemy/ext/automap.py -../sqlalchemy/ext/__init__.py -../sqlalchemy/ext/hybrid.py -../sqlalchemy/ext/compiler.py -../sqlalchemy/ext/horizontal_shard.py -../sqlalchemy/ext/orderinglist.py -../sqlalchemy/ext/instrumentation.py -../sqlalchemy/ext/mutable.py -../sqlalchemy/ext/declarative/base.py -../sqlalchemy/ext/declarative/__init__.py -../sqlalchemy/ext/declarative/clsregistry.py -../sqlalchemy/ext/declarative/api.py -../sqlalchemy/util/langhelpers.py -../sqlalchemy/util/queue.py +../sqlalchemy/inspection.py +../sqlalchemy/interfaces.py +../sqlalchemy/types.py +../sqlalchemy/pool.py +../sqlalchemy/__init__.py +../sqlalchemy/schema.py +../sqlalchemy/exc.py +../sqlalchemy/events.py +../sqlalchemy/processors.py ../sqlalchemy/util/compat.py -../sqlalchemy/util/__init__.py ../sqlalchemy/util/deprecations.py ../sqlalchemy/util/_collections.py ../sqlalchemy/util/topological.py -../sqlalchemy/connectors/mxodbc.py -../sqlalchemy/connectors/__init__.py -../sqlalchemy/connectors/pyodbc.py -../sqlalchemy/connectors/mysqldb.py -../sqlalchemy/connectors/zxJDBC.py -../sqlalchemy/dialects/postgres.py -../sqlalchemy/dialects/__init__.py -../sqlalchemy/dialects/mssql/adodbapi.py -../sqlalchemy/dialects/mssql/mxodbc.py -../sqlalchemy/dialects/mssql/base.py -../sqlalchemy/dialects/mssql/information_schema.py -../sqlalchemy/dialects/mssql/__init__.py -../sqlalchemy/dialects/mssql/pyodbc.py -../sqlalchemy/dialects/mssql/zxjdbc.py -../sqlalchemy/dialects/mssql/pymssql.py -../sqlalchemy/dialects/postgresql/pg8000.py -../sqlalchemy/dialects/postgresql/ranges.py -../sqlalchemy/dialects/postgresql/base.py -../sqlalchemy/dialects/postgresql/__init__.py -../sqlalchemy/dialects/postgresql/zxjdbc.py -../sqlalchemy/dialects/postgresql/json.py -../sqlalchemy/dialects/postgresql/pypostgresql.py -../sqlalchemy/dialects/postgresql/constraints.py -../sqlalchemy/dialects/postgresql/hstore.py -../sqlalchemy/dialects/postgresql/psycopg2.py -../sqlalchemy/dialects/sybase/mxodbc.py -../sqlalchemy/dialects/sybase/base.py -../sqlalchemy/dialects/sybase/__init__.py -../sqlalchemy/dialects/sybase/pyodbc.py -../sqlalchemy/dialects/sybase/pysybase.py -../sqlalchemy/dialects/drizzle/base.py -../sqlalchemy/dialects/drizzle/__init__.py -../sqlalchemy/dialects/drizzle/mysqldb.py -../sqlalchemy/dialects/mysql/mysqlconnector.py -../sqlalchemy/dialects/mysql/base.py -../sqlalchemy/dialects/mysql/__init__.py -../sqlalchemy/dialects/mysql/pyodbc.py -../sqlalchemy/dialects/mysql/zxjdbc.py -../sqlalchemy/dialects/mysql/oursql.py -../sqlalchemy/dialects/mysql/pymysql.py -../sqlalchemy/dialects/mysql/cymysql.py -../sqlalchemy/dialects/mysql/gaerdbms.py -../sqlalchemy/dialects/mysql/mysqldb.py -../sqlalchemy/dialects/sqlite/base.py -../sqlalchemy/dialects/sqlite/__init__.py -../sqlalchemy/dialects/sqlite/pysqlite.py -../sqlalchemy/dialects/firebird/base.py -../sqlalchemy/dialects/firebird/__init__.py -../sqlalchemy/dialects/firebird/fdb.py -../sqlalchemy/dialects/firebird/kinterbasdb.py -../sqlalchemy/dialects/oracle/base.py -../sqlalchemy/dialects/oracle/__init__.py -../sqlalchemy/dialects/oracle/zxjdbc.py -../sqlalchemy/dialects/oracle/cx_oracle.py +../sqlalchemy/util/queue.py +../sqlalchemy/util/__init__.py +../sqlalchemy/util/langhelpers.py +../sqlalchemy/ext/horizontal_shard.py +../sqlalchemy/ext/serializer.py +../sqlalchemy/ext/automap.py +../sqlalchemy/ext/associationproxy.py +../sqlalchemy/ext/__init__.py +../sqlalchemy/ext/hybrid.py +../sqlalchemy/ext/mutable.py +../sqlalchemy/ext/orderinglist.py +../sqlalchemy/ext/compiler.py +../sqlalchemy/ext/instrumentation.py +../sqlalchemy/ext/declarative/api.py +../sqlalchemy/ext/declarative/__init__.py +../sqlalchemy/ext/declarative/base.py +../sqlalchemy/ext/declarative/clsregistry.py +../sqlalchemy/event/api.py +../sqlalchemy/event/registry.py +../sqlalchemy/event/__init__.py +../sqlalchemy/event/legacy.py +../sqlalchemy/event/base.py +../sqlalchemy/event/attr.py +../sqlalchemy/sql/type_api.py +../sqlalchemy/sql/ddl.py +../sqlalchemy/sql/selectable.py +../sqlalchemy/sql/util.py +../sqlalchemy/sql/sqltypes.py +../sqlalchemy/sql/functions.py +../sqlalchemy/sql/operators.py +../sqlalchemy/sql/dml.py +../sqlalchemy/sql/naming.py +../sqlalchemy/sql/expression.py +../sqlalchemy/sql/__init__.py +../sqlalchemy/sql/schema.py +../sqlalchemy/sql/base.py +../sqlalchemy/sql/default_comparator.py +../sqlalchemy/sql/visitors.py +../sqlalchemy/sql/compiler.py +../sqlalchemy/sql/elements.py +../sqlalchemy/sql/annotation.py +../sqlalchemy/engine/default.py +../sqlalchemy/engine/url.py +../sqlalchemy/engine/util.py ../sqlalchemy/engine/interfaces.py ../sqlalchemy/engine/result.py -../sqlalchemy/engine/base.py -../sqlalchemy/engine/url.py -../sqlalchemy/engine/threadlocal.py ../sqlalchemy/engine/__init__.py -../sqlalchemy/engine/default.py -../sqlalchemy/engine/strategies.py +../sqlalchemy/engine/base.py +../sqlalchemy/engine/threadlocal.py ../sqlalchemy/engine/reflection.py -../sqlalchemy/engine/util.py -../sqlalchemy/event/base.py -../sqlalchemy/event/__init__.py -../sqlalchemy/event/attr.py -../sqlalchemy/event/registry.py -../sqlalchemy/event/legacy.py -../sqlalchemy/event/api.py -../sqlalchemy/__pycache__/interfaces.cpython-34.pyc -../sqlalchemy/__pycache__/events.cpython-34.pyc -../sqlalchemy/__pycache__/types.cpython-34.pyc -../sqlalchemy/__pycache__/exc.cpython-34.pyc -../sqlalchemy/__pycache__/schema.cpython-34.pyc -../sqlalchemy/__pycache__/inspection.cpython-34.pyc -../sqlalchemy/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/__pycache__/pool.cpython-34.pyc -../sqlalchemy/__pycache__/processors.cpython-34.pyc +../sqlalchemy/engine/strategies.py +../sqlalchemy/dialects/postgres.py +../sqlalchemy/dialects/__init__.py +../sqlalchemy/dialects/mysql/mysqlconnector.py +../sqlalchemy/dialects/mysql/pymysql.py +../sqlalchemy/dialects/mysql/cymysql.py +../sqlalchemy/dialects/mysql/oursql.py +../sqlalchemy/dialects/mysql/pyodbc.py +../sqlalchemy/dialects/mysql/__init__.py +../sqlalchemy/dialects/mysql/zxjdbc.py +../sqlalchemy/dialects/mysql/base.py +../sqlalchemy/dialects/mysql/gaerdbms.py +../sqlalchemy/dialects/mysql/mysqldb.py +../sqlalchemy/dialects/postgresql/pg8000.py +../sqlalchemy/dialects/postgresql/hstore.py +../sqlalchemy/dialects/postgresql/pypostgresql.py +../sqlalchemy/dialects/postgresql/psycopg2.py +../sqlalchemy/dialects/postgresql/ranges.py +../sqlalchemy/dialects/postgresql/json.py +../sqlalchemy/dialects/postgresql/__init__.py +../sqlalchemy/dialects/postgresql/zxjdbc.py +../sqlalchemy/dialects/postgresql/base.py +../sqlalchemy/dialects/postgresql/constraints.py +../sqlalchemy/dialects/sybase/pyodbc.py +../sqlalchemy/dialects/sybase/__init__.py +../sqlalchemy/dialects/sybase/base.py +../sqlalchemy/dialects/sybase/mxodbc.py +../sqlalchemy/dialects/sybase/pysybase.py +../sqlalchemy/dialects/firebird/fdb.py +../sqlalchemy/dialects/firebird/__init__.py +../sqlalchemy/dialects/firebird/kinterbasdb.py +../sqlalchemy/dialects/firebird/base.py +../sqlalchemy/dialects/sqlite/pysqlite.py +../sqlalchemy/dialects/sqlite/__init__.py +../sqlalchemy/dialects/sqlite/base.py +../sqlalchemy/dialects/mssql/information_schema.py +../sqlalchemy/dialects/mssql/pymssql.py +../sqlalchemy/dialects/mssql/adodbapi.py +../sqlalchemy/dialects/mssql/pyodbc.py +../sqlalchemy/dialects/mssql/__init__.py +../sqlalchemy/dialects/mssql/zxjdbc.py +../sqlalchemy/dialects/mssql/base.py +../sqlalchemy/dialects/mssql/mxodbc.py +../sqlalchemy/dialects/drizzle/__init__.py +../sqlalchemy/dialects/drizzle/base.py +../sqlalchemy/dialects/drizzle/mysqldb.py +../sqlalchemy/dialects/oracle/cx_oracle.py +../sqlalchemy/dialects/oracle/__init__.py +../sqlalchemy/dialects/oracle/zxjdbc.py +../sqlalchemy/dialects/oracle/base.py +../sqlalchemy/testing/profiling.py +../sqlalchemy/testing/warnings.py +../sqlalchemy/testing/engines.py +../sqlalchemy/testing/util.py +../sqlalchemy/testing/entities.py +../sqlalchemy/testing/mock.py +../sqlalchemy/testing/exclusions.py +../sqlalchemy/testing/assertions.py +../sqlalchemy/testing/distutils_run.py +../sqlalchemy/testing/fixtures.py +../sqlalchemy/testing/pickleable.py +../sqlalchemy/testing/__init__.py +../sqlalchemy/testing/schema.py +../sqlalchemy/testing/runner.py +../sqlalchemy/testing/config.py +../sqlalchemy/testing/requirements.py +../sqlalchemy/testing/assertsql.py +../sqlalchemy/testing/plugin/pytestplugin.py +../sqlalchemy/testing/plugin/plugin_base.py +../sqlalchemy/testing/plugin/noseplugin.py +../sqlalchemy/testing/plugin/__init__.py +../sqlalchemy/testing/suite/test_types.py +../sqlalchemy/testing/suite/test_select.py +../sqlalchemy/testing/suite/test_ddl.py +../sqlalchemy/testing/suite/test_reflection.py +../sqlalchemy/testing/suite/test_sequence.py +../sqlalchemy/testing/suite/__init__.py +../sqlalchemy/testing/suite/test_results.py +../sqlalchemy/testing/suite/test_insert.py +../sqlalchemy/testing/suite/test_update_delete.py +../sqlalchemy/orm/state.py +../sqlalchemy/orm/session.py +../sqlalchemy/orm/unitofwork.py +../sqlalchemy/orm/properties.py +../sqlalchemy/orm/collections.py +../sqlalchemy/orm/identity.py +../sqlalchemy/orm/util.py +../sqlalchemy/orm/sync.py +../sqlalchemy/orm/interfaces.py +../sqlalchemy/orm/path_registry.py +../sqlalchemy/orm/evaluator.py +../sqlalchemy/orm/deprecated_interfaces.py +../sqlalchemy/orm/mapper.py +../sqlalchemy/orm/persistence.py +../sqlalchemy/orm/dynamic.py +../sqlalchemy/orm/__init__.py +../sqlalchemy/orm/scoping.py +../sqlalchemy/orm/descriptor_props.py +../sqlalchemy/orm/loading.py +../sqlalchemy/orm/base.py +../sqlalchemy/orm/exc.py +../sqlalchemy/orm/events.py +../sqlalchemy/orm/strategies.py +../sqlalchemy/orm/query.py +../sqlalchemy/orm/dependency.py +../sqlalchemy/orm/attributes.py +../sqlalchemy/orm/relationships.py +../sqlalchemy/orm/strategy_options.py +../sqlalchemy/orm/instrumentation.py +../sqlalchemy/connectors/pyodbc.py +../sqlalchemy/connectors/__init__.py +../sqlalchemy/connectors/zxJDBC.py +../sqlalchemy/connectors/mysqldb.py +../sqlalchemy/connectors/mxodbc.py +../sqlalchemy/databases/__init__.py ../sqlalchemy/__pycache__/log.cpython-34.pyc -../sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/testing/__pycache__/engines.cpython-34.pyc -../sqlalchemy/testing/__pycache__/schema.cpython-34.pyc -../sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc -../sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc -../sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc -../sqlalchemy/testing/__pycache__/config.cpython-34.pyc -../sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc -../sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc -../sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc -../sqlalchemy/testing/__pycache__/runner.cpython-34.pyc -../sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc -../sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc -../sqlalchemy/testing/__pycache__/mock.cpython-34.pyc -../sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc -../sqlalchemy/testing/__pycache__/util.cpython-34.pyc -../sqlalchemy/testing/__pycache__/entities.cpython-34.pyc -../sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc -../sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc -../sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc -../sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc -../sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc -../sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc -../sqlalchemy/orm/__pycache__/events.cpython-34.pyc -../sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc -../sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc -../sqlalchemy/orm/__pycache__/identity.cpython-34.pyc -../sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc -../sqlalchemy/orm/__pycache__/exc.cpython-34.pyc -../sqlalchemy/orm/__pycache__/base.cpython-34.pyc -../sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/orm/__pycache__/properties.cpython-34.pyc -../sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc -../sqlalchemy/orm/__pycache__/collections.cpython-34.pyc -../sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc -../sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc -../sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc -../sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc -../sqlalchemy/orm/__pycache__/state.cpython-34.pyc -../sqlalchemy/orm/__pycache__/sync.cpython-34.pyc -../sqlalchemy/orm/__pycache__/loading.cpython-34.pyc -../sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc -../sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc -../sqlalchemy/orm/__pycache__/query.cpython-34.pyc -../sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc -../sqlalchemy/orm/__pycache__/session.cpython-34.pyc -../sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc -../sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc -../sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc -../sqlalchemy/orm/__pycache__/util.cpython-34.pyc -../sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc -../sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc -../sqlalchemy/sql/__pycache__/functions.cpython-34.pyc -../sqlalchemy/sql/__pycache__/base.cpython-34.pyc -../sqlalchemy/sql/__pycache__/schema.cpython-34.pyc -../sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc -../sqlalchemy/sql/__pycache__/elements.cpython-34.pyc -../sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc -../sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc -../sqlalchemy/sql/__pycache__/dml.cpython-34.pyc -../sqlalchemy/sql/__pycache__/expression.cpython-34.pyc -../sqlalchemy/sql/__pycache__/operators.cpython-34.pyc -../sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc -../sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc -../sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc -../sqlalchemy/sql/__pycache__/naming.cpython-34.pyc -../sqlalchemy/sql/__pycache__/util.cpython-34.pyc -../sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc -../sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc -../sqlalchemy/ext/__pycache__/automap.cpython-34.pyc -../sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc -../sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc -../sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc -../sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc -../sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc -../sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc -../sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc -../sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc -../sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc -../sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc -../sqlalchemy/util/__pycache__/queue.cpython-34.pyc +../sqlalchemy/__pycache__/inspection.cpython-34.pyc +../sqlalchemy/__pycache__/interfaces.cpython-34.pyc +../sqlalchemy/__pycache__/types.cpython-34.pyc +../sqlalchemy/__pycache__/pool.cpython-34.pyc +../sqlalchemy/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/__pycache__/schema.cpython-34.pyc +../sqlalchemy/__pycache__/exc.cpython-34.pyc +../sqlalchemy/__pycache__/events.cpython-34.pyc +../sqlalchemy/__pycache__/processors.cpython-34.pyc ../sqlalchemy/util/__pycache__/compat.cpython-34.pyc -../sqlalchemy/util/__pycache__/__init__.cpython-34.pyc ../sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc ../sqlalchemy/util/__pycache__/_collections.cpython-34.pyc ../sqlalchemy/util/__pycache__/topological.cpython-34.pyc -../sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc -../sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc -../sqlalchemy/connectors/__pycache__/mysqldb.cpython-34.pyc -../sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc -../sqlalchemy/dialects/__pycache__/postgres.cpython-34.pyc -../sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc -../sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc -../sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc -../sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc -../sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc -../sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc -../sqlalchemy/dialects/drizzle/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/drizzle/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/drizzle/__pycache__/mysqldb.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc -../sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc -../sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc -../sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc -../sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc -../sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc -../sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc -../sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc +../sqlalchemy/util/__pycache__/queue.cpython-34.pyc +../sqlalchemy/util/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc +../sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc +../sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc +../sqlalchemy/ext/__pycache__/automap.cpython-34.pyc +../sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc +../sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc +../sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc +../sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc +../sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc +../sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc +../sqlalchemy/event/__pycache__/api.cpython-34.pyc +../sqlalchemy/event/__pycache__/registry.cpython-34.pyc +../sqlalchemy/event/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/event/__pycache__/legacy.cpython-34.pyc +../sqlalchemy/event/__pycache__/base.cpython-34.pyc +../sqlalchemy/event/__pycache__/attr.cpython-34.pyc +../sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc +../sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc +../sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc +../sqlalchemy/sql/__pycache__/util.cpython-34.pyc +../sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc +../sqlalchemy/sql/__pycache__/functions.cpython-34.pyc +../sqlalchemy/sql/__pycache__/operators.cpython-34.pyc +../sqlalchemy/sql/__pycache__/dml.cpython-34.pyc +../sqlalchemy/sql/__pycache__/naming.cpython-34.pyc +../sqlalchemy/sql/__pycache__/expression.cpython-34.pyc +../sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/sql/__pycache__/schema.cpython-34.pyc +../sqlalchemy/sql/__pycache__/base.cpython-34.pyc +../sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc +../sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc +../sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc +../sqlalchemy/sql/__pycache__/elements.cpython-34.pyc +../sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc +../sqlalchemy/engine/__pycache__/default.cpython-34.pyc +../sqlalchemy/engine/__pycache__/url.cpython-34.pyc +../sqlalchemy/engine/__pycache__/util.cpython-34.pyc ../sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc ../sqlalchemy/engine/__pycache__/result.cpython-34.pyc -../sqlalchemy/engine/__pycache__/base.cpython-34.pyc -../sqlalchemy/engine/__pycache__/url.cpython-34.pyc -../sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc ../sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/engine/__pycache__/default.cpython-34.pyc -../sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc +../sqlalchemy/engine/__pycache__/base.cpython-34.pyc +../sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc ../sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc -../sqlalchemy/engine/__pycache__/util.cpython-34.pyc -../sqlalchemy/event/__pycache__/base.cpython-34.pyc -../sqlalchemy/event/__pycache__/__init__.cpython-34.pyc -../sqlalchemy/event/__pycache__/attr.cpython-34.pyc -../sqlalchemy/event/__pycache__/registry.cpython-34.pyc -../sqlalchemy/event/__pycache__/legacy.cpython-34.pyc -../sqlalchemy/event/__pycache__/api.cpython-34.pyc +../sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc +../sqlalchemy/dialects/__pycache__/postgres.cpython-34.pyc +../sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/constraints.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc +../sqlalchemy/dialects/drizzle/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/drizzle/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/drizzle/__pycache__/mysqldb.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc +../sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc +../sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc +../sqlalchemy/testing/__pycache__/engines.cpython-34.pyc +../sqlalchemy/testing/__pycache__/util.cpython-34.pyc +../sqlalchemy/testing/__pycache__/entities.cpython-34.pyc +../sqlalchemy/testing/__pycache__/mock.cpython-34.pyc +../sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc +../sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc +../sqlalchemy/testing/__pycache__/distutils_run.cpython-34.pyc +../sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc +../sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc +../sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/testing/__pycache__/schema.cpython-34.pyc +../sqlalchemy/testing/__pycache__/runner.cpython-34.pyc +../sqlalchemy/testing/__pycache__/config.cpython-34.pyc +../sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc +../sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc +../sqlalchemy/orm/__pycache__/state.cpython-34.pyc +../sqlalchemy/orm/__pycache__/session.cpython-34.pyc +../sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc +../sqlalchemy/orm/__pycache__/properties.cpython-34.pyc +../sqlalchemy/orm/__pycache__/collections.cpython-34.pyc +../sqlalchemy/orm/__pycache__/identity.cpython-34.pyc +../sqlalchemy/orm/__pycache__/util.cpython-34.pyc +../sqlalchemy/orm/__pycache__/sync.cpython-34.pyc +../sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc +../sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc +../sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc +../sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc +../sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc +../sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc +../sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc +../sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc +../sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc +../sqlalchemy/orm/__pycache__/loading.cpython-34.pyc +../sqlalchemy/orm/__pycache__/base.cpython-34.pyc +../sqlalchemy/orm/__pycache__/exc.cpython-34.pyc +../sqlalchemy/orm/__pycache__/events.cpython-34.pyc +../sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc +../sqlalchemy/orm/__pycache__/query.cpython-34.pyc +../sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc +../sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc +../sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc +../sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc +../sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/mysqldb.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc +../sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc ../sqlalchemy/cprocessors.cpython-34m.so ../sqlalchemy/cresultproxy.cpython-34m.so ../sqlalchemy/cutils.cpython-34m.so ./ +SOURCES.txt dependency_links.txt PKG-INFO -SOURCES.txt top_level.txt diff --git a/Linux_i686/lib/python3.4/site-packages/_cffi_backend.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/_cffi_backend.cpython-34m.so deleted file mode 100755 index 64ddf7223997093c9788c3bc545024bafb455bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217248 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. - - Contact - ------- - - `Mailing list `_ - -Platform: UNKNOWN -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 diff --git a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/SOURCES.txt b/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/SOURCES.txt deleted file mode 100644 index 599d5cc..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/SOURCES.txt +++ /dev/null @@ -1,104 +0,0 @@ -LICENSE -MANIFEST.in -setup.cfg -setup.py -setup_base.py -c/_cffi_backend.c -c/file_emulator.h -c/malloc_closure.h -c/minibuffer.h -c/misc_thread.h -c/misc_win32.h -c/test_c.py -c/wchar_helper.h -c/libffi_msvc/ffi.c -c/libffi_msvc/ffi.h -c/libffi_msvc/ffi_common.h -c/libffi_msvc/fficonfig.h -c/libffi_msvc/ffitarget.h -c/libffi_msvc/prep_cif.c -c/libffi_msvc/types.c -c/libffi_msvc/win32.c -c/libffi_msvc/win64.asm -c/libffi_msvc/win64.obj -cffi/__init__.py -cffi/api.py -cffi/backend_ctypes.py -cffi/commontypes.py -cffi/cparser.py -cffi/ffiplatform.py -cffi/gc_weakref.py -cffi/lock.py -cffi/model.py -cffi/vengine_cpy.py -cffi/vengine_gen.py -cffi/verifier.py -cffi.egg-info/PKG-INFO -cffi.egg-info/SOURCES.txt -cffi.egg-info/dependency_links.txt -cffi.egg-info/not-zip-safe -cffi.egg-info/requires.txt -cffi.egg-info/top_level.txt -demo/_curses.py -demo/api.py -demo/bsdopendirtype.py -demo/btrfs-snap.py -demo/cffi-cocoa.py -demo/fastcsv.py -demo/gmp.py -demo/pwuid.py -demo/py.cleanup -demo/pyobj.py -demo/readdir.py -demo/readdir2.py -demo/readdir_ctypes.py -demo/setup.py -demo/winclipboard.py -demo/xclient.py -doc/Makefile -doc/design.rst -doc/make.bat -doc/source/conf.py -doc/source/index.rst -testing/__init__.py -testing/backend_tests.py -testing/callback_in_thread.py -testing/support.py -testing/test_cdata.py -testing/test_ctypes.py -testing/test_ffi_backend.py -testing/test_function.py -testing/test_model.py -testing/test_ownlib.py -testing/test_parsing.py -testing/test_platform.py -testing/test_unicode_literals.py -testing/test_verify.py -testing/test_verify2.py -testing/test_version.py -testing/test_vgen.py -testing/test_vgen2.py -testing/test_zdistutils.py -testing/test_zintegration.py -testing/udir.py -testing/snippets/distutils_module/setup.py -testing/snippets/distutils_module/snip_basic_verify.py -testing/snippets/distutils_module/build/lib.linux-x86_64-2.7/snip_basic_verify.py -testing/snippets/distutils_package_1/setup.py -testing/snippets/distutils_package_1/build/lib.linux-x86_64-2.7/snip_basic_verify1/__init__.py -testing/snippets/distutils_package_1/snip_basic_verify1/__init__.py -testing/snippets/distutils_package_2/setup.py -testing/snippets/distutils_package_2/build/lib.linux-x86_64-2.7/snip_basic_verify2/__init__.py -testing/snippets/distutils_package_2/snip_basic_verify2/__init__.py -testing/snippets/infrastructure/setup.py -testing/snippets/infrastructure/build/lib.linux-x86_64-2.7/snip_infrastructure/__init__.py -testing/snippets/infrastructure/snip_infrastructure/__init__.py -testing/snippets/setuptools_module/setup.py -testing/snippets/setuptools_module/snip_setuptools_verify.py -testing/snippets/setuptools_module/build/lib.linux-x86_64-2.7/snip_setuptools_verify.py -testing/snippets/setuptools_package_1/setup.py -testing/snippets/setuptools_package_1/build/lib.linux-x86_64-2.7/snip_setuptools_verify1/__init__.py -testing/snippets/setuptools_package_1/snip_setuptools_verify1/__init__.py -testing/snippets/setuptools_package_2/setup.py -testing/snippets/setuptools_package_2/build/lib.linux-x86_64-2.7/snip_setuptools_verify2/__init__.py -testing/snippets/setuptools_package_2/snip_setuptools_verify2/__init__.py \ No newline at end of file diff --git a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/installed-files.txt deleted file mode 100644 index 614df6a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/installed-files.txt +++ /dev/null @@ -1,32 +0,0 @@ -../cffi/lock.py -../cffi/backend_ctypes.py -../cffi/__init__.py -../cffi/ffiplatform.py -../cffi/vengine_gen.py -../cffi/commontypes.py -../cffi/vengine_cpy.py -../cffi/api.py -../cffi/gc_weakref.py -../cffi/verifier.py -../cffi/cparser.py -../cffi/model.py -../cffi/__pycache__/lock.cpython-34.pyc -../cffi/__pycache__/backend_ctypes.cpython-34.pyc -../cffi/__pycache__/__init__.cpython-34.pyc -../cffi/__pycache__/ffiplatform.cpython-34.pyc -../cffi/__pycache__/vengine_gen.cpython-34.pyc -../cffi/__pycache__/commontypes.cpython-34.pyc -../cffi/__pycache__/vengine_cpy.cpython-34.pyc -../cffi/__pycache__/api.cpython-34.pyc -../cffi/__pycache__/gc_weakref.cpython-34.pyc -../cffi/__pycache__/verifier.cpython-34.pyc -../cffi/__pycache__/cparser.cpython-34.pyc -../cffi/__pycache__/model.cpython-34.pyc -../_cffi_backend.cpython-34m.so -./ -dependency_links.txt -PKG-INFO -SOURCES.txt -not-zip-safe -top_level.txt -requires.txt diff --git a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/requires.txt b/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/requires.txt deleted file mode 100644 index dc1c9e1..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -pycparser diff --git a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/top_level.txt deleted file mode 100644 index f645779..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -_cffi_backend -cffi diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/__init__.py b/Linux_i686/lib/python3.4/site-packages/cffi/__init__.py deleted file mode 100644 index df981fd..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -__all__ = ['FFI', 'VerificationError', 'VerificationMissing', 'CDefError', - 'FFIError'] - -from .api import FFI, CDefError, FFIError -from .ffiplatform import VerificationError, VerificationMissing - -__version__ = "0.8.6" -__version_info__ = (0, 8, 6) diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/api.py b/Linux_i686/lib/python3.4/site-packages/cffi/api.py deleted file mode 100644 index aed9715..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/api.py +++ /dev/null @@ -1,497 +0,0 @@ -import sys, types -from .lock import allocate_lock - -try: - callable -except NameError: - # Python 3.1 - from collections import Callable - callable = lambda x: isinstance(x, Callable) - -try: - basestring -except NameError: - # Python 3.x - basestring = str - - -class FFIError(Exception): - pass - -class CDefError(Exception): - def __str__(self): - try: - line = 'line %d: ' % (self.args[1].coord.line,) - except (AttributeError, TypeError, IndexError): - line = '' - return '%s%s' % (line, self.args[0]) - - -class FFI(object): - r''' - The main top-level class that you instantiate once, or once per module. - - Example usage: - - ffi = FFI() - ffi.cdef(""" - int printf(const char *, ...); - """) - - C = ffi.dlopen(None) # standard library - -or- - C = ffi.verify() # use a C compiler: verify the decl above is right - - C.printf("hello, %s!\n", ffi.new("char[]", "world")) - ''' - - def __init__(self, backend=None): - """Create an FFI instance. The 'backend' argument is used to - select a non-default backend, mostly for tests. - """ - from . import cparser, model - if backend is None: - # You need PyPy (>= 2.0 beta), or a CPython (>= 2.6) with - # _cffi_backend.so compiled. - import _cffi_backend as backend - from . import __version__ - assert backend.__version__ == __version__ - # (If you insist you can also try to pass the option - # 'backend=backend_ctypes.CTypesBackend()', but don't - # rely on it! It's probably not going to work well.) - - self._backend = backend - self._lock = allocate_lock() - self._parser = cparser.Parser() - self._cached_btypes = {} - self._parsed_types = types.ModuleType('parsed_types').__dict__ - self._new_types = types.ModuleType('new_types').__dict__ - self._function_caches = [] - self._libraries = [] - self._cdefsources = [] - if hasattr(backend, 'set_ffi'): - backend.set_ffi(self) - for name in backend.__dict__: - if name.startswith('RTLD_'): - setattr(self, name, getattr(backend, name)) - # - with self._lock: - self.BVoidP = self._get_cached_btype(model.voidp_type) - if isinstance(backend, types.ModuleType): - # _cffi_backend: attach these constants to the class - if not hasattr(FFI, 'NULL'): - FFI.NULL = self.cast(self.BVoidP, 0) - FFI.CData, FFI.CType = backend._get_types() - else: - # ctypes backend: attach these constants to the instance - self.NULL = self.cast(self.BVoidP, 0) - self.CData, self.CType = backend._get_types() - - def cdef(self, csource, override=False, packed=False): - """Parse the given C source. This registers all declared functions, - types, and global variables. The functions and global variables can - then be accessed via either 'ffi.dlopen()' or 'ffi.verify()'. - The types can be used in 'ffi.new()' and other functions. - If 'packed' is specified as True, all structs declared inside this - cdef are packed, i.e. laid out without any field alignment at all. - """ - if not isinstance(csource, str): # unicode, on Python 2 - if not isinstance(csource, basestring): - raise TypeError("cdef() argument must be a string") - csource = csource.encode('ascii') - with self._lock: - self._parser.parse(csource, override=override, packed=packed) - self._cdefsources.append(csource) - if override: - for cache in self._function_caches: - cache.clear() - - def dlopen(self, name, flags=0): - """Load and return a dynamic library identified by 'name'. - The standard C library can be loaded by passing None. - Note that functions and types declared by 'ffi.cdef()' are not - linked to a particular library, just like C headers; in the - library we only look for the actual (untyped) symbols. - """ - assert isinstance(name, basestring) or name is None - with self._lock: - lib, function_cache = _make_ffi_library(self, name, flags) - self._function_caches.append(function_cache) - self._libraries.append(lib) - return lib - - def _typeof_locked(self, cdecl): - # call me with the lock! - key = cdecl - if key in self._parsed_types: - return self._parsed_types[key] - # - if not isinstance(cdecl, str): # unicode, on Python 2 - cdecl = cdecl.encode('ascii') - # - type = self._parser.parse_type(cdecl) - really_a_function_type = type.is_raw_function - if really_a_function_type: - type = type.as_function_pointer() - btype = self._get_cached_btype(type) - result = btype, really_a_function_type - self._parsed_types[key] = result - return result - - def _typeof(self, cdecl, consider_function_as_funcptr=False): - # string -> ctype object - try: - result = self._parsed_types[cdecl] - except KeyError: - with self._lock: - result = self._typeof_locked(cdecl) - # - btype, really_a_function_type = result - if really_a_function_type and not consider_function_as_funcptr: - raise CDefError("the type %r is a function type, not a " - "pointer-to-function type" % (cdecl,)) - return btype - - def typeof(self, cdecl): - """Parse the C type given as a string and return the - corresponding object. - It can also be used on 'cdata' instance to get its C type. - """ - if isinstance(cdecl, basestring): - return self._typeof(cdecl) - if isinstance(cdecl, self.CData): - return self._backend.typeof(cdecl) - if isinstance(cdecl, types.BuiltinFunctionType): - res = _builtin_function_type(cdecl) - if res is not None: - return res - if (isinstance(cdecl, types.FunctionType) - and hasattr(cdecl, '_cffi_base_type')): - with self._lock: - return self._get_cached_btype(cdecl._cffi_base_type) - raise TypeError(type(cdecl)) - - def sizeof(self, cdecl): - """Return the size in bytes of the argument. It can be a - string naming a C type, or a 'cdata' instance. - """ - if isinstance(cdecl, basestring): - BType = self._typeof(cdecl) - return self._backend.sizeof(BType) - else: - return self._backend.sizeof(cdecl) - - def alignof(self, cdecl): - """Return the natural alignment size in bytes of the C type - given as a string. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.alignof(cdecl) - - def offsetof(self, cdecl, fieldname): - """Return the offset of the named field inside the given - structure, which must be given as a C type name. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.typeoffsetof(cdecl, fieldname)[1] - - def new(self, cdecl, init=None): - """Allocate an instance according to the specified C type and - return a pointer to it. The specified C type must be either a - pointer or an array: ``new('X *')`` allocates an X and returns - a pointer to it, whereas ``new('X[n]')`` allocates an array of - n X'es and returns an array referencing it (which works - mostly like a pointer, like in C). You can also use - ``new('X[]', n)`` to allocate an array of a non-constant - length n. - - The memory is initialized following the rules of declaring a - global variable in C: by default it is zero-initialized, but - an explicit initializer can be given which can be used to - fill all or part of the memory. - - When the returned object goes out of scope, the memory - is freed. In other words the returned object has - ownership of the value of type 'cdecl' that it points to. This - means that the raw data can be used as long as this object is - kept alive, but must not be used for a longer time. Be careful - about that when copying the pointer to the memory somewhere - else, e.g. into another structure. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.newp(cdecl, init) - - def cast(self, cdecl, source): - """Similar to a C cast: returns an instance of the named C - type initialized with the given 'source'. The source is - casted between integers or pointers of any type. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - return self._backend.cast(cdecl, source) - - def string(self, cdata, maxlen=-1): - """Return a Python string (or unicode string) from the 'cdata'. - If 'cdata' is a pointer or array of characters or bytes, returns - the null-terminated string. The returned string extends until - the first null character, or at most 'maxlen' characters. If - 'cdata' is an array then 'maxlen' defaults to its length. - - If 'cdata' is a pointer or array of wchar_t, returns a unicode - string following the same rules. - - If 'cdata' is a single character or byte or a wchar_t, returns - it as a string or unicode string. - - If 'cdata' is an enum, returns the value of the enumerator as a - string, or 'NUMBER' if the value is out of range. - """ - return self._backend.string(cdata, maxlen) - - def buffer(self, cdata, size=-1): - """Return a read-write buffer object that references the raw C data - pointed to by the given 'cdata'. The 'cdata' must be a pointer or - an array. Can be passed to functions expecting a buffer, or directly - manipulated with: - - buf[:] get a copy of it in a regular string, or - buf[idx] as a single character - buf[:] = ... - buf[idx] = ... change the content - """ - return self._backend.buffer(cdata, size) - - def callback(self, cdecl, python_callable=None, error=None): - """Return a callback object or a decorator making such a - callback object. 'cdecl' must name a C function pointer type. - The callback invokes the specified 'python_callable' (which may - be provided either directly or via a decorator). Important: the - callback object must be manually kept alive for as long as the - callback may be invoked from the C level. - """ - def callback_decorator_wrap(python_callable): - if not callable(python_callable): - raise TypeError("the 'python_callable' argument " - "is not callable") - return self._backend.callback(cdecl, python_callable, error) - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl, consider_function_as_funcptr=True) - if python_callable is None: - return callback_decorator_wrap # decorator mode - else: - return callback_decorator_wrap(python_callable) # direct mode - - def getctype(self, cdecl, replace_with=''): - """Return a string giving the C type 'cdecl', which may be itself - a string or a object. If 'replace_with' is given, it gives - extra text to append (or insert for more complicated C types), like - a variable name, or '*' to get actually the C type 'pointer-to-cdecl'. - """ - if isinstance(cdecl, basestring): - cdecl = self._typeof(cdecl) - replace_with = replace_with.strip() - if (replace_with.startswith('*') - and '&[' in self._backend.getcname(cdecl, '&')): - replace_with = '(%s)' % replace_with - elif replace_with and not replace_with[0] in '[(': - replace_with = ' ' + replace_with - return self._backend.getcname(cdecl, replace_with) - - def gc(self, cdata, destructor): - """Return a new cdata object that points to the same - data. Later, when this new cdata object is garbage-collected, - 'destructor(old_cdata_object)' will be called. - """ - with self._lock: - try: - gc_weakrefs = self.gc_weakrefs - except AttributeError: - from .gc_weakref import GcWeakrefs - gc_weakrefs = self.gc_weakrefs = GcWeakrefs(self) - return gc_weakrefs.build(cdata, destructor) - - def _get_cached_btype(self, type): - assert self._lock.acquire(False) is False - # call me with the lock! - try: - BType = self._cached_btypes[type] - except KeyError: - finishlist = [] - BType = type.get_cached_btype(self, finishlist) - for type in finishlist: - type.finish_backend_type(self, finishlist) - return BType - - def verify(self, source='', tmpdir=None, **kwargs): - """Verify that the current ffi signatures compile on this - machine, and return a dynamic library object. The dynamic - library can be used to call functions and access global - variables declared in this 'ffi'. The library is compiled - by the C compiler: it gives you C-level API compatibility - (including calling macros). This is unlike 'ffi.dlopen()', - which requires binary compatibility in the signatures. - """ - from .verifier import Verifier, _caller_dir_pycache - tmpdir = tmpdir or _caller_dir_pycache() - self.verifier = Verifier(self, source, tmpdir, **kwargs) - lib = self.verifier.load_library() - self._libraries.append(lib) - return lib - - def _get_errno(self): - return self._backend.get_errno() - def _set_errno(self, errno): - self._backend.set_errno(errno) - errno = property(_get_errno, _set_errno, None, - "the value of 'errno' from/to the C calls") - - def getwinerror(self, code=-1): - return self._backend.getwinerror(code) - - def _pointer_to(self, ctype): - from . import model - with self._lock: - return model.pointer_cache(self, ctype) - - def addressof(self, cdata, field=None): - """Return the address of a . - If 'field' is specified, return the address of this field. - """ - ctype = self._backend.typeof(cdata) - ctype, offset = self._backend.typeoffsetof(ctype, field) - ctypeptr = self._pointer_to(ctype) - return self._backend.rawaddressof(ctypeptr, cdata, offset) - - def include(self, ffi_to_include): - """Includes the typedefs, structs, unions and enums defined - in another FFI instance. Usage is similar to a #include in C, - where a part of the program might include types defined in - another part for its own usage. Note that the include() - method has no effect on functions, constants and global - variables, which must anyway be accessed directly from the - lib object returned by the original FFI instance. - """ - with ffi_to_include._lock: - with self._lock: - self._parser.include(ffi_to_include._parser) - self._cdefsources.append('[') - self._cdefsources.extend(ffi_to_include._cdefsources) - self._cdefsources.append(']') - - def new_handle(self, x): - return self._backend.newp_handle(self.BVoidP, x) - - def from_handle(self, x): - return self._backend.from_handle(x) - - -def _load_backend_lib(backend, name, flags): - if name is None: - if sys.platform != "win32": - return backend.load_library(None, flags) - name = "c" # Windows: load_library(None) fails, but this works - # (backward compatibility hack only) - try: - if '.' not in name and '/' not in name: - raise OSError("library not found: %r" % (name,)) - return backend.load_library(name, flags) - except OSError: - import ctypes.util - path = ctypes.util.find_library(name) - if path is None: - raise # propagate the original OSError - return backend.load_library(path, flags) - -def _make_ffi_library(ffi, libname, flags): - import os - backend = ffi._backend - backendlib = _load_backend_lib(backend, libname, flags) - copied_enums = [] - # - def make_accessor_locked(name): - key = 'function ' + name - if key in ffi._parser._declarations: - tp = ffi._parser._declarations[key] - BType = ffi._get_cached_btype(tp) - try: - value = backendlib.load_function(BType, name) - except KeyError as e: - raise AttributeError('%s: %s' % (name, e)) - library.__dict__[name] = value - return - # - key = 'variable ' + name - if key in ffi._parser._declarations: - tp = ffi._parser._declarations[key] - BType = ffi._get_cached_btype(tp) - read_variable = backendlib.read_variable - write_variable = backendlib.write_variable - setattr(FFILibrary, name, property( - lambda self: read_variable(BType, name), - lambda self, value: write_variable(BType, name, value))) - return - # - if not copied_enums: - from . import model - for key, tp in ffi._parser._declarations.items(): - if not isinstance(tp, model.EnumType): - continue - for enumname, enumval in zip(tp.enumerators, tp.enumvalues): - if enumname not in library.__dict__: - library.__dict__[enumname] = enumval - for key, val in ffi._parser._int_constants.items(): - if key not in library.__dict__: - library.__dict__[key] = val - - copied_enums.append(True) - if name in library.__dict__: - return - # - raise AttributeError(name) - # - def make_accessor(name): - with ffi._lock: - if name in library.__dict__ or name in FFILibrary.__dict__: - return # added by another thread while waiting for the lock - make_accessor_locked(name) - # - class FFILibrary(object): - def __getattr__(self, name): - make_accessor(name) - return getattr(self, name) - def __setattr__(self, name, value): - try: - property = getattr(self.__class__, name) - except AttributeError: - make_accessor(name) - setattr(self, name, value) - else: - property.__set__(self, value) - # - if libname is not None: - try: - if not isinstance(libname, str): # unicode, on Python 2 - libname = libname.encode('utf-8') - FFILibrary.__name__ = 'FFILibrary_%s' % libname - except UnicodeError: - pass - library = FFILibrary() - return library, library.__dict__ - -def _builtin_function_type(func): - # a hack to make at least ffi.typeof(builtin_function) work, - # if the builtin function was obtained by 'vengine_cpy'. - import sys - try: - module = sys.modules[func.__module__] - ffi = module._cffi_original_ffi - types_of_builtin_funcs = module._cffi_types_of_builtin_funcs - tp = types_of_builtin_funcs[func] - except (KeyError, AttributeError, TypeError): - return None - else: - with ffi._lock: - return ffi._get_cached_btype(tp) diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/backend_ctypes.py b/Linux_i686/lib/python3.4/site-packages/cffi/backend_ctypes.py deleted file mode 100644 index 2b2b481..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/backend_ctypes.py +++ /dev/null @@ -1,1049 +0,0 @@ -import ctypes, ctypes.util, operator, sys -from . import model - -if sys.version_info < (3,): - integer_types = (int, long) - bytechr = chr -else: - unicode = str - integer_types = int - xrange = range - bytechr = lambda num: bytes([num]) - -class CTypesType(type): - pass - -class CTypesData(object): - __metaclass__ = CTypesType - __slots__ = ['__weakref__'] - __name__ = '' - - def __init__(self, *args): - raise TypeError("cannot instantiate %r" % (self.__class__,)) - - @classmethod - def _newp(cls, init): - raise TypeError("expected a pointer or array ctype, got '%s'" - % (cls._get_c_name(),)) - - @staticmethod - def _to_ctypes(value): - raise TypeError - - @classmethod - def _arg_to_ctypes(cls, *value): - try: - ctype = cls._ctype - except AttributeError: - raise TypeError("cannot create an instance of %r" % (cls,)) - if value: - res = cls._to_ctypes(*value) - if not isinstance(res, ctype): - res = cls._ctype(res) - else: - res = cls._ctype() - return res - - @classmethod - def _create_ctype_obj(cls, init): - if init is None: - return cls._arg_to_ctypes() - else: - return cls._arg_to_ctypes(init) - - @staticmethod - def _from_ctypes(ctypes_value): - raise TypeError - - @classmethod - def _get_c_name(cls, replace_with=''): - return cls._reftypename.replace(' &', replace_with) - - @classmethod - def _fix_class(cls): - cls.__name__ = 'CData<%s>' % (cls._get_c_name(),) - cls.__qualname__ = 'CData<%s>' % (cls._get_c_name(),) - cls.__module__ = 'ffi' - - def _get_own_repr(self): - raise NotImplementedError - - def _addr_repr(self, address): - if address == 0: - return 'NULL' - else: - if address < 0: - address += 1 << (8*ctypes.sizeof(ctypes.c_void_p)) - return '0x%x' % address - - def __repr__(self, c_name=None): - own = self._get_own_repr() - return '' % (c_name or self._get_c_name(), own) - - def _convert_to_address(self, BClass): - if BClass is None: - raise TypeError("cannot convert %r to an address" % ( - self._get_c_name(),)) - else: - raise TypeError("cannot convert %r to %r" % ( - self._get_c_name(), BClass._get_c_name())) - - @classmethod - def _get_size(cls): - return ctypes.sizeof(cls._ctype) - - def _get_size_of_instance(self): - return ctypes.sizeof(self._ctype) - - @classmethod - def _cast_from(cls, source): - raise TypeError("cannot cast to %r" % (cls._get_c_name(),)) - - def _cast_to_integer(self): - return self._convert_to_address(None) - - @classmethod - def _alignment(cls): - return ctypes.alignment(cls._ctype) - - def __iter__(self): - raise TypeError("cdata %r does not support iteration" % ( - self._get_c_name()),) - - def _make_cmp(name): - cmpfunc = getattr(operator, name) - def cmp(self, other): - if isinstance(other, CTypesData): - return cmpfunc(self._convert_to_address(None), - other._convert_to_address(None)) - else: - return NotImplemented - cmp.func_name = name - return cmp - - __eq__ = _make_cmp('__eq__') - __ne__ = _make_cmp('__ne__') - __lt__ = _make_cmp('__lt__') - __le__ = _make_cmp('__le__') - __gt__ = _make_cmp('__gt__') - __ge__ = _make_cmp('__ge__') - - def __hash__(self): - return hash(type(self)) ^ hash(self._convert_to_address(None)) - - def _to_string(self, maxlen): - raise TypeError("string(): %r" % (self,)) - - -class CTypesGenericPrimitive(CTypesData): - __slots__ = [] - - def __eq__(self, other): - return self is other - - def __ne__(self, other): - return self is not other - - def __hash__(self): - return object.__hash__(self) - - def _get_own_repr(self): - return repr(self._from_ctypes(self._value)) - - -class CTypesGenericArray(CTypesData): - __slots__ = [] - - @classmethod - def _newp(cls, init): - return cls(init) - - def __iter__(self): - for i in xrange(len(self)): - yield self[i] - - def _get_own_repr(self): - return self._addr_repr(ctypes.addressof(self._blob)) - - -class CTypesGenericPtr(CTypesData): - __slots__ = ['_address', '_as_ctype_ptr'] - _automatic_casts = False - - @classmethod - def _newp(cls, init): - return cls(init) - - @classmethod - def _cast_from(cls, source): - if source is None: - address = 0 - elif isinstance(source, CTypesData): - address = source._cast_to_integer() - elif isinstance(source, integer_types): - address = source - else: - raise TypeError("bad type for cast to %r: %r" % - (cls, type(source).__name__)) - return cls._new_pointer_at(address) - - @classmethod - def _new_pointer_at(cls, address): - self = cls.__new__(cls) - self._address = address - self._as_ctype_ptr = ctypes.cast(address, cls._ctype) - return self - - def _get_own_repr(self): - try: - return self._addr_repr(self._address) - except AttributeError: - return '???' - - def _cast_to_integer(self): - return self._address - - def __nonzero__(self): - return bool(self._address) - - def __bool__(self): - return bool(self._address) - - @classmethod - def _to_ctypes(cls, value): - if not isinstance(value, CTypesData): - raise TypeError("unexpected %s object" % type(value).__name__) - address = value._convert_to_address(cls) - return ctypes.cast(address, cls._ctype) - - @classmethod - def _from_ctypes(cls, ctypes_ptr): - address = ctypes.cast(ctypes_ptr, ctypes.c_void_p).value or 0 - return cls._new_pointer_at(address) - - @classmethod - def _initialize(cls, ctypes_ptr, value): - if value: - ctypes_ptr.contents = cls._to_ctypes(value).contents - - def _convert_to_address(self, BClass): - if (BClass in (self.__class__, None) or BClass._automatic_casts - or self._automatic_casts): - return self._address - else: - return CTypesData._convert_to_address(self, BClass) - - -class CTypesBaseStructOrUnion(CTypesData): - __slots__ = ['_blob'] - - @classmethod - def _create_ctype_obj(cls, init): - # may be overridden - raise TypeError("cannot instantiate opaque type %s" % (cls,)) - - def _get_own_repr(self): - return self._addr_repr(ctypes.addressof(self._blob)) - - @classmethod - def _offsetof(cls, fieldname): - return getattr(cls._ctype, fieldname).offset - - def _convert_to_address(self, BClass): - if getattr(BClass, '_BItem', None) is self.__class__: - return ctypes.addressof(self._blob) - else: - return CTypesData._convert_to_address(self, BClass) - - @classmethod - def _from_ctypes(cls, ctypes_struct_or_union): - self = cls.__new__(cls) - self._blob = ctypes_struct_or_union - return self - - @classmethod - def _to_ctypes(cls, value): - return value._blob - - def __repr__(self, c_name=None): - return CTypesData.__repr__(self, c_name or self._get_c_name(' &')) - - -class CTypesBackend(object): - - PRIMITIVE_TYPES = { - 'char': ctypes.c_char, - 'short': ctypes.c_short, - 'int': ctypes.c_int, - 'long': ctypes.c_long, - 'long long': ctypes.c_longlong, - 'signed char': ctypes.c_byte, - 'unsigned char': ctypes.c_ubyte, - 'unsigned short': ctypes.c_ushort, - 'unsigned int': ctypes.c_uint, - 'unsigned long': ctypes.c_ulong, - 'unsigned long long': ctypes.c_ulonglong, - 'float': ctypes.c_float, - 'double': ctypes.c_double, - '_Bool': ctypes.c_bool, - } - - for _name in ['unsigned long long', 'unsigned long', - 'unsigned int', 'unsigned short', 'unsigned char']: - _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) - PRIMITIVE_TYPES['uint%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_void_p): - PRIMITIVE_TYPES['uintptr_t'] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_size_t): - PRIMITIVE_TYPES['size_t'] = PRIMITIVE_TYPES[_name] - - for _name in ['long long', 'long', 'int', 'short', 'signed char']: - _size = ctypes.sizeof(PRIMITIVE_TYPES[_name]) - PRIMITIVE_TYPES['int%d_t' % (8*_size)] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_void_p): - PRIMITIVE_TYPES['intptr_t'] = PRIMITIVE_TYPES[_name] - PRIMITIVE_TYPES['ptrdiff_t'] = PRIMITIVE_TYPES[_name] - if _size == ctypes.sizeof(ctypes.c_size_t): - PRIMITIVE_TYPES['ssize_t'] = PRIMITIVE_TYPES[_name] - - - def __init__(self): - self.RTLD_LAZY = 0 # not supported anyway by ctypes - self.RTLD_NOW = 0 - self.RTLD_GLOBAL = ctypes.RTLD_GLOBAL - self.RTLD_LOCAL = ctypes.RTLD_LOCAL - - def set_ffi(self, ffi): - self.ffi = ffi - - def _get_types(self): - return CTypesData, CTypesType - - def load_library(self, path, flags=0): - cdll = ctypes.CDLL(path, flags) - return CTypesLibrary(self, cdll) - - def new_void_type(self): - class CTypesVoid(CTypesData): - __slots__ = [] - _reftypename = 'void &' - @staticmethod - def _from_ctypes(novalue): - return None - @staticmethod - def _to_ctypes(novalue): - if novalue is not None: - raise TypeError("None expected, got %s object" % - (type(novalue).__name__,)) - return None - CTypesVoid._fix_class() - return CTypesVoid - - def new_primitive_type(self, name): - if name == 'wchar_t': - raise NotImplementedError(name) - ctype = self.PRIMITIVE_TYPES[name] - if name == 'char': - kind = 'char' - elif name in ('float', 'double'): - kind = 'float' - else: - if name in ('signed char', 'unsigned char'): - kind = 'byte' - elif name == '_Bool': - kind = 'bool' - else: - kind = 'int' - is_signed = (ctype(-1).value == -1) - # - def _cast_source_to_int(source): - if isinstance(source, (integer_types, float)): - source = int(source) - elif isinstance(source, CTypesData): - source = source._cast_to_integer() - elif isinstance(source, bytes): - source = ord(source) - elif source is None: - source = 0 - else: - raise TypeError("bad type for cast to %r: %r" % - (CTypesPrimitive, type(source).__name__)) - return source - # - class CTypesPrimitive(CTypesGenericPrimitive): - __slots__ = ['_value'] - _ctype = ctype - _reftypename = '%s &' % name - - def __init__(self, value): - self._value = value - - @staticmethod - def _create_ctype_obj(init): - if init is None: - return ctype() - return ctype(CTypesPrimitive._to_ctypes(init)) - - if kind == 'int' or kind == 'byte': - @classmethod - def _cast_from(cls, source): - source = _cast_source_to_int(source) - source = ctype(source).value # cast within range - return cls(source) - def __int__(self): - return self._value - - if kind == 'bool': - @classmethod - def _cast_from(cls, source): - if not isinstance(source, (integer_types, float)): - source = _cast_source_to_int(source) - return cls(bool(source)) - def __int__(self): - return self._value - - if kind == 'char': - @classmethod - def _cast_from(cls, source): - source = _cast_source_to_int(source) - source = bytechr(source & 0xFF) - return cls(source) - def __int__(self): - return ord(self._value) - - if kind == 'float': - @classmethod - def _cast_from(cls, source): - if isinstance(source, float): - pass - elif isinstance(source, CTypesGenericPrimitive): - if hasattr(source, '__float__'): - source = float(source) - else: - source = int(source) - else: - source = _cast_source_to_int(source) - source = ctype(source).value # fix precision - return cls(source) - def __int__(self): - return int(self._value) - def __float__(self): - return self._value - - _cast_to_integer = __int__ - - if kind == 'int' or kind == 'byte' or kind == 'bool': - @staticmethod - def _to_ctypes(x): - if not isinstance(x, integer_types): - if isinstance(x, CTypesData): - x = int(x) - else: - raise TypeError("integer expected, got %s" % - type(x).__name__) - if ctype(x).value != x: - if not is_signed and x < 0: - raise OverflowError("%s: negative integer" % name) - else: - raise OverflowError("%s: integer out of bounds" - % name) - return x - - if kind == 'char': - @staticmethod - def _to_ctypes(x): - if isinstance(x, bytes) and len(x) == 1: - return x - if isinstance(x, CTypesPrimitive): # > - return x._value - raise TypeError("character expected, got %s" % - type(x).__name__) - - if kind == 'float': - @staticmethod - def _to_ctypes(x): - if not isinstance(x, (integer_types, float, CTypesData)): - raise TypeError("float expected, got %s" % - type(x).__name__) - return ctype(x).value - - @staticmethod - def _from_ctypes(value): - return getattr(value, 'value', value) - - @staticmethod - def _initialize(blob, init): - blob.value = CTypesPrimitive._to_ctypes(init) - - if kind == 'char': - def _to_string(self, maxlen): - return self._value - if kind == 'byte': - def _to_string(self, maxlen): - return chr(self._value & 0xff) - # - CTypesPrimitive._fix_class() - return CTypesPrimitive - - def new_pointer_type(self, BItem): - getbtype = self.ffi._get_cached_btype - if BItem is getbtype(model.PrimitiveType('char')): - kind = 'charp' - elif BItem in (getbtype(model.PrimitiveType('signed char')), - getbtype(model.PrimitiveType('unsigned char'))): - kind = 'bytep' - elif BItem is getbtype(model.void_type): - kind = 'voidp' - else: - kind = 'generic' - # - class CTypesPtr(CTypesGenericPtr): - __slots__ = ['_own'] - if kind == 'charp': - __slots__ += ['__as_strbuf'] - _BItem = BItem - if hasattr(BItem, '_ctype'): - _ctype = ctypes.POINTER(BItem._ctype) - _bitem_size = ctypes.sizeof(BItem._ctype) - else: - _ctype = ctypes.c_void_p - if issubclass(BItem, CTypesGenericArray): - _reftypename = BItem._get_c_name('(* &)') - else: - _reftypename = BItem._get_c_name(' * &') - - def __init__(self, init): - ctypeobj = BItem._create_ctype_obj(init) - if kind == 'charp': - self.__as_strbuf = ctypes.create_string_buffer( - ctypeobj.value + b'\x00') - self._as_ctype_ptr = ctypes.cast( - self.__as_strbuf, self._ctype) - else: - self._as_ctype_ptr = ctypes.pointer(ctypeobj) - self._address = ctypes.cast(self._as_ctype_ptr, - ctypes.c_void_p).value - self._own = True - - def __add__(self, other): - if isinstance(other, integer_types): - return self._new_pointer_at(self._address + - other * self._bitem_size) - else: - return NotImplemented - - def __sub__(self, other): - if isinstance(other, integer_types): - return self._new_pointer_at(self._address - - other * self._bitem_size) - elif type(self) is type(other): - return (self._address - other._address) // self._bitem_size - else: - return NotImplemented - - def __getitem__(self, index): - if getattr(self, '_own', False) and index != 0: - raise IndexError - return BItem._from_ctypes(self._as_ctype_ptr[index]) - - def __setitem__(self, index, value): - self._as_ctype_ptr[index] = BItem._to_ctypes(value) - - if kind == 'charp' or kind == 'voidp': - @classmethod - def _arg_to_ctypes(cls, *value): - if value and isinstance(value[0], bytes): - return ctypes.c_char_p(value[0]) - else: - return super(CTypesPtr, cls)._arg_to_ctypes(*value) - - if kind == 'charp' or kind == 'bytep': - def _to_string(self, maxlen): - if maxlen < 0: - maxlen = sys.maxsize - p = ctypes.cast(self._as_ctype_ptr, - ctypes.POINTER(ctypes.c_char)) - n = 0 - while n < maxlen and p[n] != b'\x00': - n += 1 - return b''.join([p[i] for i in range(n)]) - - def _get_own_repr(self): - if getattr(self, '_own', False): - return 'owning %d bytes' % ( - ctypes.sizeof(self._as_ctype_ptr.contents),) - return super(CTypesPtr, self)._get_own_repr() - # - if (BItem is self.ffi._get_cached_btype(model.void_type) or - BItem is self.ffi._get_cached_btype(model.PrimitiveType('char'))): - CTypesPtr._automatic_casts = True - # - CTypesPtr._fix_class() - return CTypesPtr - - def new_array_type(self, CTypesPtr, length): - if length is None: - brackets = ' &[]' - else: - brackets = ' &[%d]' % length - BItem = CTypesPtr._BItem - getbtype = self.ffi._get_cached_btype - if BItem is getbtype(model.PrimitiveType('char')): - kind = 'char' - elif BItem in (getbtype(model.PrimitiveType('signed char')), - getbtype(model.PrimitiveType('unsigned char'))): - kind = 'byte' - else: - kind = 'generic' - # - class CTypesArray(CTypesGenericArray): - __slots__ = ['_blob', '_own'] - if length is not None: - _ctype = BItem._ctype * length - else: - __slots__.append('_ctype') - _reftypename = BItem._get_c_name(brackets) - _declared_length = length - _CTPtr = CTypesPtr - - def __init__(self, init): - if length is None: - if isinstance(init, integer_types): - len1 = init - init = None - elif kind == 'char' and isinstance(init, bytes): - len1 = len(init) + 1 # extra null - else: - init = tuple(init) - len1 = len(init) - self._ctype = BItem._ctype * len1 - self._blob = self._ctype() - self._own = True - if init is not None: - self._initialize(self._blob, init) - - @staticmethod - def _initialize(blob, init): - if isinstance(init, bytes): - init = [init[i:i+1] for i in range(len(init))] - else: - init = tuple(init) - if len(init) > len(blob): - raise IndexError("too many initializers") - addr = ctypes.cast(blob, ctypes.c_void_p).value - PTR = ctypes.POINTER(BItem._ctype) - itemsize = ctypes.sizeof(BItem._ctype) - for i, value in enumerate(init): - p = ctypes.cast(addr + i * itemsize, PTR) - BItem._initialize(p.contents, value) - - def __len__(self): - return len(self._blob) - - def __getitem__(self, index): - if not (0 <= index < len(self._blob)): - raise IndexError - return BItem._from_ctypes(self._blob[index]) - - def __setitem__(self, index, value): - if not (0 <= index < len(self._blob)): - raise IndexError - self._blob[index] = BItem._to_ctypes(value) - - if kind == 'char' or kind == 'byte': - def _to_string(self, maxlen): - if maxlen < 0: - maxlen = len(self._blob) - p = ctypes.cast(self._blob, - ctypes.POINTER(ctypes.c_char)) - n = 0 - while n < maxlen and p[n] != b'\x00': - n += 1 - return b''.join([p[i] for i in range(n)]) - - def _get_own_repr(self): - if getattr(self, '_own', False): - return 'owning %d bytes' % (ctypes.sizeof(self._blob),) - return super(CTypesArray, self)._get_own_repr() - - def _convert_to_address(self, BClass): - if BClass in (CTypesPtr, None) or BClass._automatic_casts: - return ctypes.addressof(self._blob) - else: - return CTypesData._convert_to_address(self, BClass) - - @staticmethod - def _from_ctypes(ctypes_array): - self = CTypesArray.__new__(CTypesArray) - self._blob = ctypes_array - return self - - @staticmethod - def _arg_to_ctypes(value): - return CTypesPtr._arg_to_ctypes(value) - - def __add__(self, other): - if isinstance(other, integer_types): - return CTypesPtr._new_pointer_at( - ctypes.addressof(self._blob) + - other * ctypes.sizeof(BItem._ctype)) - else: - return NotImplemented - - @classmethod - def _cast_from(cls, source): - raise NotImplementedError("casting to %r" % ( - cls._get_c_name(),)) - # - CTypesArray._fix_class() - return CTypesArray - - def _new_struct_or_union(self, kind, name, base_ctypes_class): - # - class struct_or_union(base_ctypes_class): - pass - struct_or_union.__name__ = '%s_%s' % (kind, name) - # - class CTypesStructOrUnion(CTypesBaseStructOrUnion): - __slots__ = ['_blob'] - _ctype = struct_or_union - _reftypename = '%s &' % (name,) - _kind = kind - # - CTypesStructOrUnion._fix_class() - return CTypesStructOrUnion - - def new_struct_type(self, name): - return self._new_struct_or_union('struct', name, ctypes.Structure) - - def new_union_type(self, name): - return self._new_struct_or_union('union', name, ctypes.Union) - - def complete_struct_or_union(self, CTypesStructOrUnion, fields, tp, - totalsize=-1, totalalignment=-1, sflags=0): - if totalsize >= 0 or totalalignment >= 0: - raise NotImplementedError("the ctypes backend of CFFI does not support " - "structures completed by verify(); please " - "compile and install the _cffi_backend module.") - struct_or_union = CTypesStructOrUnion._ctype - fnames = [fname for (fname, BField, bitsize) in fields] - btypes = [BField for (fname, BField, bitsize) in fields] - bitfields = [bitsize for (fname, BField, bitsize) in fields] - # - bfield_types = {} - cfields = [] - for (fname, BField, bitsize) in fields: - if bitsize < 0: - cfields.append((fname, BField._ctype)) - bfield_types[fname] = BField - else: - cfields.append((fname, BField._ctype, bitsize)) - bfield_types[fname] = Ellipsis - if sflags & 8: - struct_or_union._pack_ = 1 - struct_or_union._fields_ = cfields - CTypesStructOrUnion._bfield_types = bfield_types - # - @staticmethod - def _create_ctype_obj(init): - result = struct_or_union() - if init is not None: - initialize(result, init) - return result - CTypesStructOrUnion._create_ctype_obj = _create_ctype_obj - # - def initialize(blob, init): - if is_union: - if len(init) > 1: - raise ValueError("union initializer: %d items given, but " - "only one supported (use a dict if needed)" - % (len(init),)) - if not isinstance(init, dict): - if isinstance(init, (bytes, unicode)): - raise TypeError("union initializer: got a str") - init = tuple(init) - if len(init) > len(fnames): - raise ValueError("too many values for %s initializer" % - CTypesStructOrUnion._get_c_name()) - init = dict(zip(fnames, init)) - addr = ctypes.addressof(blob) - for fname, value in init.items(): - BField, bitsize = name2fieldtype[fname] - assert bitsize < 0, \ - "not implemented: initializer with bit fields" - offset = CTypesStructOrUnion._offsetof(fname) - PTR = ctypes.POINTER(BField._ctype) - p = ctypes.cast(addr + offset, PTR) - BField._initialize(p.contents, value) - is_union = CTypesStructOrUnion._kind == 'union' - name2fieldtype = dict(zip(fnames, zip(btypes, bitfields))) - # - for fname, BField, bitsize in fields: - if fname == '': - raise NotImplementedError("nested anonymous structs/unions") - if hasattr(CTypesStructOrUnion, fname): - raise ValueError("the field name %r conflicts in " - "the ctypes backend" % fname) - if bitsize < 0: - def getter(self, fname=fname, BField=BField, - offset=CTypesStructOrUnion._offsetof(fname), - PTR=ctypes.POINTER(BField._ctype)): - addr = ctypes.addressof(self._blob) - p = ctypes.cast(addr + offset, PTR) - return BField._from_ctypes(p.contents) - def setter(self, value, fname=fname, BField=BField): - setattr(self._blob, fname, BField._to_ctypes(value)) - # - if issubclass(BField, CTypesGenericArray): - setter = None - if BField._declared_length == 0: - def getter(self, fname=fname, BFieldPtr=BField._CTPtr, - offset=CTypesStructOrUnion._offsetof(fname), - PTR=ctypes.POINTER(BField._ctype)): - addr = ctypes.addressof(self._blob) - p = ctypes.cast(addr + offset, PTR) - return BFieldPtr._from_ctypes(p) - # - else: - def getter(self, fname=fname, BField=BField): - return BField._from_ctypes(getattr(self._blob, fname)) - def setter(self, value, fname=fname, BField=BField): - # xxx obscure workaround - value = BField._to_ctypes(value) - oldvalue = getattr(self._blob, fname) - setattr(self._blob, fname, value) - if value != getattr(self._blob, fname): - setattr(self._blob, fname, oldvalue) - raise OverflowError("value too large for bitfield") - setattr(CTypesStructOrUnion, fname, property(getter, setter)) - # - CTypesPtr = self.ffi._get_cached_btype(model.PointerType(tp)) - for fname in fnames: - if hasattr(CTypesPtr, fname): - raise ValueError("the field name %r conflicts in " - "the ctypes backend" % fname) - def getter(self, fname=fname): - return getattr(self[0], fname) - def setter(self, value, fname=fname): - setattr(self[0], fname, value) - setattr(CTypesPtr, fname, property(getter, setter)) - - def new_function_type(self, BArgs, BResult, has_varargs): - nameargs = [BArg._get_c_name() for BArg in BArgs] - if has_varargs: - nameargs.append('...') - nameargs = ', '.join(nameargs) - # - class CTypesFunctionPtr(CTypesGenericPtr): - __slots__ = ['_own_callback', '_name'] - _ctype = ctypes.CFUNCTYPE(getattr(BResult, '_ctype', None), - *[BArg._ctype for BArg in BArgs], - use_errno=True) - _reftypename = BResult._get_c_name('(* &)(%s)' % (nameargs,)) - - def __init__(self, init, error=None): - # create a callback to the Python callable init() - import traceback - assert not has_varargs, "varargs not supported for callbacks" - if getattr(BResult, '_ctype', None) is not None: - error = BResult._from_ctypes( - BResult._create_ctype_obj(error)) - else: - error = None - def callback(*args): - args2 = [] - for arg, BArg in zip(args, BArgs): - args2.append(BArg._from_ctypes(arg)) - try: - res2 = init(*args2) - res2 = BResult._to_ctypes(res2) - except: - traceback.print_exc() - res2 = error - if issubclass(BResult, CTypesGenericPtr): - if res2: - res2 = ctypes.cast(res2, ctypes.c_void_p).value - # .value: http://bugs.python.org/issue1574593 - else: - res2 = None - #print repr(res2) - return res2 - if issubclass(BResult, CTypesGenericPtr): - # The only pointers callbacks can return are void*s: - # http://bugs.python.org/issue5710 - callback_ctype = ctypes.CFUNCTYPE( - ctypes.c_void_p, - *[BArg._ctype for BArg in BArgs], - use_errno=True) - else: - callback_ctype = CTypesFunctionPtr._ctype - self._as_ctype_ptr = callback_ctype(callback) - self._address = ctypes.cast(self._as_ctype_ptr, - ctypes.c_void_p).value - self._own_callback = init - - @staticmethod - def _initialize(ctypes_ptr, value): - if value: - raise NotImplementedError("ctypes backend: not supported: " - "initializers for function pointers") - - def __repr__(self): - c_name = getattr(self, '_name', None) - if c_name: - i = self._reftypename.index('(* &)') - if self._reftypename[i-1] not in ' )*': - c_name = ' ' + c_name - c_name = self._reftypename.replace('(* &)', c_name) - return CTypesData.__repr__(self, c_name) - - def _get_own_repr(self): - if getattr(self, '_own_callback', None) is not None: - return 'calling %r' % (self._own_callback,) - return super(CTypesFunctionPtr, self)._get_own_repr() - - def __call__(self, *args): - if has_varargs: - assert len(args) >= len(BArgs) - extraargs = args[len(BArgs):] - args = args[:len(BArgs)] - else: - assert len(args) == len(BArgs) - ctypes_args = [] - for arg, BArg in zip(args, BArgs): - ctypes_args.append(BArg._arg_to_ctypes(arg)) - if has_varargs: - for i, arg in enumerate(extraargs): - if arg is None: - ctypes_args.append(ctypes.c_void_p(0)) # NULL - continue - if not isinstance(arg, CTypesData): - raise TypeError( - "argument %d passed in the variadic part " - "needs to be a cdata object (got %s)" % - (1 + len(BArgs) + i, type(arg).__name__)) - ctypes_args.append(arg._arg_to_ctypes(arg)) - result = self._as_ctype_ptr(*ctypes_args) - return BResult._from_ctypes(result) - # - CTypesFunctionPtr._fix_class() - return CTypesFunctionPtr - - def new_enum_type(self, name, enumerators, enumvalues, CTypesInt): - assert isinstance(name, str) - reverse_mapping = dict(zip(reversed(enumvalues), - reversed(enumerators))) - # - class CTypesEnum(CTypesInt): - __slots__ = [] - _reftypename = '%s &' % name - - def _get_own_repr(self): - value = self._value - try: - return '%d: %s' % (value, reverse_mapping[value]) - except KeyError: - return str(value) - - def _to_string(self, maxlen): - value = self._value - try: - return reverse_mapping[value] - except KeyError: - return str(value) - # - CTypesEnum._fix_class() - return CTypesEnum - - def get_errno(self): - return ctypes.get_errno() - - def set_errno(self, value): - ctypes.set_errno(value) - - def string(self, b, maxlen=-1): - return b._to_string(maxlen) - - def buffer(self, bptr, size=-1): - raise NotImplementedError("buffer() with ctypes backend") - - def sizeof(self, cdata_or_BType): - if isinstance(cdata_or_BType, CTypesData): - return cdata_or_BType._get_size_of_instance() - else: - assert issubclass(cdata_or_BType, CTypesData) - return cdata_or_BType._get_size() - - def alignof(self, BType): - assert issubclass(BType, CTypesData) - return BType._alignment() - - def newp(self, BType, source): - if not issubclass(BType, CTypesData): - raise TypeError - return BType._newp(source) - - def cast(self, BType, source): - return BType._cast_from(source) - - def callback(self, BType, source, error): - return BType(source, error) - - typeof = type - - def getcname(self, BType, replace_with): - return BType._get_c_name(replace_with) - - def typeoffsetof(self, BType, fieldname): - if fieldname is not None and issubclass(BType, CTypesGenericPtr): - BType = BType._BItem - if not issubclass(BType, CTypesBaseStructOrUnion): - raise TypeError("expected a struct or union ctype") - if fieldname is None: - return (BType, 0) - else: - BField = BType._bfield_types[fieldname] - if BField is Ellipsis: - raise TypeError("not supported for bitfields") - return (BField, BType._offsetof(fieldname)) - - def rawaddressof(self, BTypePtr, cdata, offset): - if isinstance(cdata, CTypesBaseStructOrUnion): - ptr = ctypes.pointer(type(cdata)._to_ctypes(cdata)) - elif isinstance(cdata, CTypesGenericPtr): - ptr = type(cdata)._to_ctypes(cdata) - else: - raise TypeError("expected a ") - if offset != 0: - ptr = ctypes.cast( - ctypes.c_void_p( - ctypes.cast(ptr, ctypes.c_void_p).value + offset), - type(ptr)) - return BTypePtr._from_ctypes(ptr) - - -class CTypesLibrary(object): - - def __init__(self, backend, cdll): - self.backend = backend - self.cdll = cdll - - def load_function(self, BType, name): - c_func = getattr(self.cdll, name) - funcobj = BType._from_ctypes(c_func) - funcobj._name = name - return funcobj - - def read_variable(self, BType, name): - try: - ctypes_obj = BType._ctype.in_dll(self.cdll, name) - except AttributeError as e: - raise NotImplementedError(e) - return BType._from_ctypes(ctypes_obj) - - def write_variable(self, BType, name, value): - new_ctypes_obj = BType._to_ctypes(value) - ctypes_obj = BType._ctype.in_dll(self.cdll, name) - ctypes.memmove(ctypes.addressof(ctypes_obj), - ctypes.addressof(new_ctypes_obj), - ctypes.sizeof(BType._ctype)) diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/commontypes.py b/Linux_i686/lib/python3.4/site-packages/cffi/commontypes.py deleted file mode 100644 index 9daf2ff..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/commontypes.py +++ /dev/null @@ -1,248 +0,0 @@ -import sys -from . import api, model - - -COMMON_TYPES = { - 'FILE': model.unknown_type('FILE', '_IO_FILE'), - 'bool': '_Bool', - } - -for _type in model.PrimitiveType.ALL_PRIMITIVE_TYPES: - if _type.endswith('_t'): - COMMON_TYPES[_type] = _type -del _type - -_CACHE = {} - -def resolve_common_type(commontype): - try: - return _CACHE[commontype] - except KeyError: - result = COMMON_TYPES.get(commontype, commontype) - if not isinstance(result, str): - pass # result is already a BaseType - elif result.endswith(' *'): - if result.startswith('const '): - result = model.ConstPointerType( - resolve_common_type(result[6:-2])) - else: - result = model.PointerType(resolve_common_type(result[:-2])) - elif result in model.PrimitiveType.ALL_PRIMITIVE_TYPES: - result = model.PrimitiveType(result) - else: - if commontype == result: - raise api.FFIError("Unsupported type: %r. Please file a bug " - "if you think it should be." % (commontype,)) - result = resolve_common_type(result) # recursively - assert isinstance(result, model.BaseTypeByIdentity) - _CACHE[commontype] = result - return result - - -# ____________________________________________________________ -# Windows common types - - -def win_common_types(maxsize): - result = {} - if maxsize < (1<<32): - result.update({ # Windows 32-bits - 'HALF_PTR': 'short', - 'INT_PTR': 'int', - 'LONG_PTR': 'long', - 'UHALF_PTR': 'unsigned short', - 'UINT_PTR': 'unsigned int', - 'ULONG_PTR': 'unsigned long', - }) - else: - result.update({ # Windows 64-bits - 'HALF_PTR': 'int', - 'INT_PTR': 'long long', - 'LONG_PTR': 'long long', - 'UHALF_PTR': 'unsigned int', - 'UINT_PTR': 'unsigned long long', - 'ULONG_PTR': 'unsigned long long', - }) - result.update({ - "BYTE": "unsigned char", - "BOOL": "int", - "CCHAR": "char", - "CHAR": "char", - "DWORD": "unsigned long", - "DWORD32": "unsigned int", - "DWORD64": "unsigned long long", - "FLOAT": "float", - "INT": "int", - "INT8": "signed char", - "INT16": "short", - "INT32": "int", - "INT64": "long long", - "LONG": "long", - "LONGLONG": "long long", - "LONG32": "int", - "LONG64": "long long", - "WORD": "unsigned short", - "PVOID": model.voidp_type, - "ULONGLONG": "unsigned long long", - "WCHAR": "wchar_t", - "SHORT": "short", - "TBYTE": "WCHAR", - "TCHAR": "WCHAR", - "UCHAR": "unsigned char", - "UINT": "unsigned int", - "UINT8": "unsigned char", - "UINT16": "unsigned short", - "UINT32": "unsigned int", - "UINT64": "unsigned long long", - "ULONG": "unsigned long", - "ULONG32": "unsigned int", - "ULONG64": "unsigned long long", - "USHORT": "unsigned short", - - "SIZE_T": "ULONG_PTR", - "SSIZE_T": "LONG_PTR", - "ATOM": "WORD", - "BOOLEAN": "BYTE", - "COLORREF": "DWORD", - - "HANDLE": "PVOID", - "DWORDLONG": "ULONGLONG", - "DWORD_PTR": "ULONG_PTR", - "HACCEL": "HANDLE", - - "HBITMAP": "HANDLE", - "HBRUSH": "HANDLE", - "HCOLORSPACE": "HANDLE", - "HCONV": "HANDLE", - "HCONVLIST": "HANDLE", - "HDC": "HANDLE", - "HDDEDATA": "HANDLE", - "HDESK": "HANDLE", - "HDROP": "HANDLE", - "HDWP": "HANDLE", - "HENHMETAFILE": "HANDLE", - "HFILE": "int", - "HFONT": "HANDLE", - "HGDIOBJ": "HANDLE", - "HGLOBAL": "HANDLE", - "HHOOK": "HANDLE", - "HICON": "HANDLE", - "HCURSOR": "HICON", - "HINSTANCE": "HANDLE", - "HKEY": "HANDLE", - "HKL": "HANDLE", - "HLOCAL": "HANDLE", - "HMENU": "HANDLE", - "HMETAFILE": "HANDLE", - "HMODULE": "HINSTANCE", - "HMONITOR": "HANDLE", - "HPALETTE": "HANDLE", - "HPEN": "HANDLE", - "HRESULT": "LONG", - "HRGN": "HANDLE", - "HRSRC": "HANDLE", - "HSZ": "HANDLE", - "WINSTA": "HANDLE", - "HWND": "HANDLE", - - "LANGID": "WORD", - "LCID": "DWORD", - "LCTYPE": "DWORD", - "LGRPID": "DWORD", - "LPARAM": "LONG_PTR", - "LPBOOL": "BOOL *", - "LPBYTE": "BYTE *", - "LPCOLORREF": "DWORD *", - "LPCSTR": "const char *", - - "LPCVOID": model.const_voidp_type, - "LPCWSTR": "const WCHAR *", - "LPCTSTR": "LPCWSTR", - "LPDWORD": "DWORD *", - "LPHANDLE": "HANDLE *", - "LPINT": "int *", - "LPLONG": "long *", - "LPSTR": "CHAR *", - "LPWSTR": "WCHAR *", - "LPTSTR": "LPWSTR", - "LPVOID": model.voidp_type, - "LPWORD": "WORD *", - "LRESULT": "LONG_PTR", - "PBOOL": "BOOL *", - "PBOOLEAN": "BOOLEAN *", - "PBYTE": "BYTE *", - "PCHAR": "CHAR *", - "PCSTR": "const CHAR *", - "PCTSTR": "LPCWSTR", - "PCWSTR": "const WCHAR *", - "PDWORD": "DWORD *", - "PDWORDLONG": "DWORDLONG *", - "PDWORD_PTR": "DWORD_PTR *", - "PDWORD32": "DWORD32 *", - "PDWORD64": "DWORD64 *", - "PFLOAT": "FLOAT *", - "PHALF_PTR": "HALF_PTR *", - "PHANDLE": "HANDLE *", - "PHKEY": "HKEY *", - "PINT": "int *", - "PINT_PTR": "INT_PTR *", - "PINT8": "INT8 *", - "PINT16": "INT16 *", - "PINT32": "INT32 *", - "PINT64": "INT64 *", - "PLCID": "PDWORD", - "PLONG": "LONG *", - "PLONGLONG": "LONGLONG *", - "PLONG_PTR": "LONG_PTR *", - "PLONG32": "LONG32 *", - "PLONG64": "LONG64 *", - "PSHORT": "SHORT *", - "PSIZE_T": "SIZE_T *", - "PSSIZE_T": "SSIZE_T *", - "PSTR": "CHAR *", - "PTBYTE": "TBYTE *", - "PTCHAR": "TCHAR *", - "PTSTR": "LPWSTR", - "PUCHAR": "UCHAR *", - "PUHALF_PTR": "UHALF_PTR *", - "PUINT": "UINT *", - "PUINT_PTR": "UINT_PTR *", - "PUINT8": "UINT8 *", - "PUINT16": "UINT16 *", - "PUINT32": "UINT32 *", - "PUINT64": "UINT64 *", - "PULONG": "ULONG *", - "PULONGLONG": "ULONGLONG *", - "PULONG_PTR": "ULONG_PTR *", - "PULONG32": "ULONG32 *", - "PULONG64": "ULONG64 *", - "PUSHORT": "USHORT *", - "PWCHAR": "WCHAR *", - "PWORD": "WORD *", - "PWSTR": "WCHAR *", - "QWORD": "unsigned long long", - "SC_HANDLE": "HANDLE", - "SC_LOCK": "LPVOID", - "SERVICE_STATUS_HANDLE": "HANDLE", - - "UNICODE_STRING": model.StructType( - "_UNICODE_STRING", - ["Length", - "MaximumLength", - "Buffer"], - [model.PrimitiveType("unsigned short"), - model.PrimitiveType("unsigned short"), - model.PointerType(model.PrimitiveType("wchar_t"))], - [-1, -1, -1]), - "PUNICODE_STRING": "UNICODE_STRING *", - "PCUNICODE_STRING": "const UNICODE_STRING *", - - "USN": "LONGLONG", - "VOID": model.void_type, - "WPARAM": "UINT_PTR", - }) - return result - - -if sys.platform == 'win32': - COMMON_TYPES.update(win_common_types(sys.maxsize)) diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/cparser.py b/Linux_i686/lib/python3.4/site-packages/cffi/cparser.py deleted file mode 100644 index a53d4c3..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/cparser.py +++ /dev/null @@ -1,584 +0,0 @@ - -from . import api, model -from .commontypes import COMMON_TYPES, resolve_common_type -try: - from . import _pycparser as pycparser -except ImportError: - import pycparser -import weakref, re, sys - -try: - if sys.version_info < (3,): - import thread as _thread - else: - import _thread - lock = _thread.allocate_lock() -except ImportError: - lock = None - -_r_comment = re.compile(r"/\*.*?\*/|//.*?$", re.DOTALL | re.MULTILINE) -_r_define = re.compile(r"^\s*#\s*define\s+([A-Za-z_][A-Za-z_0-9]*)\s+(.*?)$", - re.MULTILINE) -_r_partial_enum = re.compile(r"=\s*\.\.\.\s*[,}]|\.\.\.\s*\}") -_r_enum_dotdotdot = re.compile(r"__dotdotdot\d+__$") -_r_partial_array = re.compile(r"\[\s*\.\.\.\s*\]") -_r_words = re.compile(r"\w+|\S") -_parser_cache = None -_r_int_literal = re.compile(r"^0?x?[0-9a-f]+u?l?$", re.IGNORECASE) - -def _get_parser(): - global _parser_cache - if _parser_cache is None: - _parser_cache = pycparser.CParser() - return _parser_cache - -def _preprocess(csource): - # Remove comments. NOTE: this only work because the cdef() section - # should not contain any string literal! - csource = _r_comment.sub(' ', csource) - # Remove the "#define FOO x" lines - macros = {} - for match in _r_define.finditer(csource): - macroname, macrovalue = match.groups() - macros[macroname] = macrovalue - csource = _r_define.sub('', csource) - # Replace "[...]" with "[__dotdotdotarray__]" - csource = _r_partial_array.sub('[__dotdotdotarray__]', csource) - # Replace "...}" with "__dotdotdotNUM__}". This construction should - # occur only at the end of enums; at the end of structs we have "...;}" - # and at the end of vararg functions "...);". Also replace "=...[,}]" - # with ",__dotdotdotNUM__[,}]": this occurs in the enums too, when - # giving an unknown value. - matches = list(_r_partial_enum.finditer(csource)) - for number, match in enumerate(reversed(matches)): - p = match.start() - if csource[p] == '=': - p2 = csource.find('...', p, match.end()) - assert p2 > p - csource = '%s,__dotdotdot%d__ %s' % (csource[:p], number, - csource[p2+3:]) - else: - assert csource[p:p+3] == '...' - csource = '%s __dotdotdot%d__ %s' % (csource[:p], number, - csource[p+3:]) - # Replace all remaining "..." with the same name, "__dotdotdot__", - # which is declared with a typedef for the purpose of C parsing. - return csource.replace('...', ' __dotdotdot__ '), macros - -def _common_type_names(csource): - # Look in the source for what looks like usages of types from the - # list of common types. A "usage" is approximated here as the - # appearance of the word, minus a "definition" of the type, which - # is the last word in a "typedef" statement. Approximative only - # but should be fine for all the common types. - look_for_words = set(COMMON_TYPES) - look_for_words.add(';') - look_for_words.add('typedef') - words_used = set() - is_typedef = False - previous_word = '' - for word in _r_words.findall(csource): - if word in look_for_words: - if word == ';': - if is_typedef: - words_used.discard(previous_word) - look_for_words.discard(previous_word) - is_typedef = False - elif word == 'typedef': - is_typedef = True - else: # word in COMMON_TYPES - words_used.add(word) - previous_word = word - return words_used - - -class Parser(object): - - def __init__(self): - self._declarations = {} - self._anonymous_counter = 0 - self._structnode2type = weakref.WeakKeyDictionary() - self._override = False - self._packed = False - self._int_constants = {} - - def _parse(self, csource): - csource, macros = _preprocess(csource) - # XXX: for more efficiency we would need to poke into the - # internals of CParser... the following registers the - # typedefs, because their presence or absence influences the - # parsing itself (but what they are typedef'ed to plays no role) - ctn = _common_type_names(csource) - typenames = [] - for name in sorted(self._declarations): - if name.startswith('typedef '): - name = name[8:] - typenames.append(name) - ctn.discard(name) - typenames += sorted(ctn) - # - csourcelines = ['typedef int %s;' % typename for typename in typenames] - csourcelines.append('typedef int __dotdotdot__;') - csourcelines.append(csource) - csource = '\n'.join(csourcelines) - if lock is not None: - lock.acquire() # pycparser is not thread-safe... - try: - ast = _get_parser().parse(csource) - except pycparser.c_parser.ParseError as e: - self.convert_pycparser_error(e, csource) - finally: - if lock is not None: - lock.release() - # csource will be used to find buggy source text - return ast, macros, csource - - def _convert_pycparser_error(self, e, csource): - # xxx look for ":NUM:" at the start of str(e) and try to interpret - # it as a line number - line = None - msg = str(e) - if msg.startswith(':') and ':' in msg[1:]: - linenum = msg[1:msg.find(':',1)] - if linenum.isdigit(): - linenum = int(linenum, 10) - csourcelines = csource.splitlines() - if 1 <= linenum <= len(csourcelines): - line = csourcelines[linenum-1] - return line - - def convert_pycparser_error(self, e, csource): - line = self._convert_pycparser_error(e, csource) - - msg = str(e) - if line: - msg = 'cannot parse "%s"\n%s' % (line.strip(), msg) - else: - msg = 'parse error\n%s' % (msg,) - raise api.CDefError(msg) - - def parse(self, csource, override=False, packed=False): - prev_override = self._override - prev_packed = self._packed - try: - self._override = override - self._packed = packed - self._internal_parse(csource) - finally: - self._override = prev_override - self._packed = prev_packed - - def _internal_parse(self, csource): - ast, macros, csource = self._parse(csource) - # add the macros - self._process_macros(macros) - # find the first "__dotdotdot__" and use that as a separator - # between the repeated typedefs and the real csource - iterator = iter(ast.ext) - for decl in iterator: - if decl.name == '__dotdotdot__': - break - # - try: - for decl in iterator: - if isinstance(decl, pycparser.c_ast.Decl): - self._parse_decl(decl) - elif isinstance(decl, pycparser.c_ast.Typedef): - if not decl.name: - raise api.CDefError("typedef does not declare any name", - decl) - if (isinstance(decl.type.type, pycparser.c_ast.IdentifierType) - and decl.type.type.names == ['__dotdotdot__']): - realtype = model.unknown_type(decl.name) - elif (isinstance(decl.type, pycparser.c_ast.PtrDecl) and - isinstance(decl.type.type, pycparser.c_ast.TypeDecl) and - isinstance(decl.type.type.type, - pycparser.c_ast.IdentifierType) and - decl.type.type.type.names == ['__dotdotdot__']): - realtype = model.unknown_ptr_type(decl.name) - else: - realtype = self._get_type(decl.type, name=decl.name) - self._declare('typedef ' + decl.name, realtype) - else: - raise api.CDefError("unrecognized construct", decl) - except api.FFIError as e: - msg = self._convert_pycparser_error(e, csource) - if msg: - e.args = (e.args[0] + "\n *** Err: %s" % msg,) - raise - - def _add_constants(self, key, val): - if key in self._int_constants: - raise api.FFIError( - "multiple declarations of constant: %s" % (key,)) - self._int_constants[key] = val - - def _process_macros(self, macros): - for key, value in macros.items(): - value = value.strip() - match = _r_int_literal.search(value) - if match is not None: - int_str = match.group(0).lower().rstrip("ul") - - # "010" is not valid oct in py3 - if (int_str.startswith("0") and - int_str != "0" and - not int_str.startswith("0x")): - int_str = "0o" + int_str[1:] - - pyvalue = int(int_str, 0) - self._add_constants(key, pyvalue) - elif value == '...': - self._declare('macro ' + key, value) - else: - raise api.CDefError('only supports the syntax "#define ' - '%s ..." (literally) or "#define ' - '%s 0x1FF" for now' % (key, key)) - - def _parse_decl(self, decl): - node = decl.type - if isinstance(node, pycparser.c_ast.FuncDecl): - tp = self._get_type(node, name=decl.name) - assert isinstance(tp, model.RawFunctionType) - tp = self._get_type_pointer(tp) - self._declare('function ' + decl.name, tp) - else: - if isinstance(node, pycparser.c_ast.Struct): - # XXX do we need self._declare in any of those? - if node.decls is not None: - self._get_struct_union_enum_type('struct', node) - elif isinstance(node, pycparser.c_ast.Union): - if node.decls is not None: - self._get_struct_union_enum_type('union', node) - elif isinstance(node, pycparser.c_ast.Enum): - if node.values is not None: - self._get_struct_union_enum_type('enum', node) - elif not decl.name: - raise api.CDefError("construct does not declare any variable", - decl) - # - if decl.name: - tp = self._get_type(node, partial_length_ok=True) - if self._is_constant_globalvar(node): - self._declare('constant ' + decl.name, tp) - else: - self._declare('variable ' + decl.name, tp) - - def parse_type(self, cdecl): - ast, macros = self._parse('void __dummy(\n%s\n);' % cdecl)[:2] - assert not macros - exprnode = ast.ext[-1].type.args.params[0] - if isinstance(exprnode, pycparser.c_ast.ID): - raise api.CDefError("unknown identifier '%s'" % (exprnode.name,)) - return self._get_type(exprnode.type) - - def _declare(self, name, obj): - if name in self._declarations: - if self._declarations[name] is obj: - return - if not self._override: - raise api.FFIError( - "multiple declarations of %s (for interactive usage, " - "try cdef(xx, override=True))" % (name,)) - assert '__dotdotdot__' not in name.split() - self._declarations[name] = obj - - def _get_type_pointer(self, type, const=False): - if isinstance(type, model.RawFunctionType): - return type.as_function_pointer() - if const: - return model.ConstPointerType(type) - return model.PointerType(type) - - def _get_type(self, typenode, name=None, partial_length_ok=False): - # first, dereference typedefs, if we have it already parsed, we're good - if (isinstance(typenode, pycparser.c_ast.TypeDecl) and - isinstance(typenode.type, pycparser.c_ast.IdentifierType) and - len(typenode.type.names) == 1 and - ('typedef ' + typenode.type.names[0]) in self._declarations): - type = self._declarations['typedef ' + typenode.type.names[0]] - return type - # - if isinstance(typenode, pycparser.c_ast.ArrayDecl): - # array type - if typenode.dim is None: - length = None - else: - length = self._parse_constant( - typenode.dim, partial_length_ok=partial_length_ok) - return model.ArrayType(self._get_type(typenode.type), length) - # - if isinstance(typenode, pycparser.c_ast.PtrDecl): - # pointer type - const = (isinstance(typenode.type, pycparser.c_ast.TypeDecl) - and 'const' in typenode.type.quals) - return self._get_type_pointer(self._get_type(typenode.type), const) - # - if isinstance(typenode, pycparser.c_ast.TypeDecl): - type = typenode.type - if isinstance(type, pycparser.c_ast.IdentifierType): - # assume a primitive type. get it from .names, but reduce - # synonyms to a single chosen combination - names = list(type.names) - if names != ['signed', 'char']: # keep this unmodified - prefixes = {} - while names: - name = names[0] - if name in ('short', 'long', 'signed', 'unsigned'): - prefixes[name] = prefixes.get(name, 0) + 1 - del names[0] - else: - break - # ignore the 'signed' prefix below, and reorder the others - newnames = [] - for prefix in ('unsigned', 'short', 'long'): - for i in range(prefixes.get(prefix, 0)): - newnames.append(prefix) - if not names: - names = ['int'] # implicitly - if names == ['int']: # but kill it if 'short' or 'long' - if 'short' in prefixes or 'long' in prefixes: - names = [] - names = newnames + names - ident = ' '.join(names) - if ident == 'void': - return model.void_type - if ident == '__dotdotdot__': - raise api.FFIError(':%d: bad usage of "..."' % - typenode.coord.line) - return resolve_common_type(ident) - # - if isinstance(type, pycparser.c_ast.Struct): - # 'struct foobar' - return self._get_struct_union_enum_type('struct', type, name) - # - if isinstance(type, pycparser.c_ast.Union): - # 'union foobar' - return self._get_struct_union_enum_type('union', type, name) - # - if isinstance(type, pycparser.c_ast.Enum): - # 'enum foobar' - return self._get_struct_union_enum_type('enum', type, name) - # - if isinstance(typenode, pycparser.c_ast.FuncDecl): - # a function type - return self._parse_function_type(typenode, name) - # - # nested anonymous structs or unions end up here - if isinstance(typenode, pycparser.c_ast.Struct): - return self._get_struct_union_enum_type('struct', typenode, name, - nested=True) - if isinstance(typenode, pycparser.c_ast.Union): - return self._get_struct_union_enum_type('union', typenode, name, - nested=True) - # - raise api.FFIError(":%d: bad or unsupported type declaration" % - typenode.coord.line) - - def _parse_function_type(self, typenode, funcname=None): - params = list(getattr(typenode.args, 'params', [])) - ellipsis = ( - len(params) > 0 and - isinstance(params[-1].type, pycparser.c_ast.TypeDecl) and - isinstance(params[-1].type.type, - pycparser.c_ast.IdentifierType) and - params[-1].type.type.names == ['__dotdotdot__']) - if ellipsis: - params.pop() - if not params: - raise api.CDefError( - "%s: a function with only '(...)' as argument" - " is not correct C" % (funcname or 'in expression')) - elif (len(params) == 1 and - isinstance(params[0].type, pycparser.c_ast.TypeDecl) and - isinstance(params[0].type.type, pycparser.c_ast.IdentifierType) - and list(params[0].type.type.names) == ['void']): - del params[0] - args = [self._as_func_arg(self._get_type(argdeclnode.type)) - for argdeclnode in params] - result = self._get_type(typenode.type) - return model.RawFunctionType(tuple(args), result, ellipsis) - - def _as_func_arg(self, type): - if isinstance(type, model.ArrayType): - return model.PointerType(type.item) - elif isinstance(type, model.RawFunctionType): - return type.as_function_pointer() - else: - return type - - def _is_constant_globalvar(self, typenode): - if isinstance(typenode, pycparser.c_ast.PtrDecl): - return 'const' in typenode.quals - if isinstance(typenode, pycparser.c_ast.TypeDecl): - return 'const' in typenode.quals - return False - - def _get_struct_union_enum_type(self, kind, type, name=None, nested=False): - # First, a level of caching on the exact 'type' node of the AST. - # This is obscure, but needed because pycparser "unrolls" declarations - # such as "typedef struct { } foo_t, *foo_p" and we end up with - # an AST that is not a tree, but a DAG, with the "type" node of the - # two branches foo_t and foo_p of the trees being the same node. - # It's a bit silly but detecting "DAG-ness" in the AST tree seems - # to be the only way to distinguish this case from two independent - # structs. See test_struct_with_two_usages. - try: - return self._structnode2type[type] - except KeyError: - pass - # - # Note that this must handle parsing "struct foo" any number of - # times and always return the same StructType object. Additionally, - # one of these times (not necessarily the first), the fields of - # the struct can be specified with "struct foo { ...fields... }". - # If no name is given, then we have to create a new anonymous struct - # with no caching; in this case, the fields are either specified - # right now or never. - # - force_name = name - name = type.name - # - # get the type or create it if needed - if name is None: - # 'force_name' is used to guess a more readable name for - # anonymous structs, for the common case "typedef struct { } foo". - if force_name is not None: - explicit_name = '$%s' % force_name - else: - self._anonymous_counter += 1 - explicit_name = '$%d' % self._anonymous_counter - tp = None - else: - explicit_name = name - key = '%s %s' % (kind, name) - tp = self._declarations.get(key, None) - # - if tp is None: - if kind == 'struct': - tp = model.StructType(explicit_name, None, None, None) - elif kind == 'union': - tp = model.UnionType(explicit_name, None, None, None) - elif kind == 'enum': - tp = self._build_enum_type(explicit_name, type.values) - else: - raise AssertionError("kind = %r" % (kind,)) - if name is not None: - self._declare(key, tp) - else: - if kind == 'enum' and type.values is not None: - raise NotImplementedError( - "enum %s: the '{}' declaration should appear on the first " - "time the enum is mentioned, not later" % explicit_name) - if not tp.forcename: - tp.force_the_name(force_name) - if tp.forcename and '$' in tp.name: - self._declare('anonymous %s' % tp.forcename, tp) - # - self._structnode2type[type] = tp - # - # enums: done here - if kind == 'enum': - return tp - # - # is there a 'type.decls'? If yes, then this is the place in the - # C sources that declare the fields. If no, then just return the - # existing type, possibly still incomplete. - if type.decls is None: - return tp - # - if tp.fldnames is not None: - raise api.CDefError("duplicate declaration of struct %s" % name) - fldnames = [] - fldtypes = [] - fldbitsize = [] - for decl in type.decls: - if (isinstance(decl.type, pycparser.c_ast.IdentifierType) and - ''.join(decl.type.names) == '__dotdotdot__'): - # XXX pycparser is inconsistent: 'names' should be a list - # of strings, but is sometimes just one string. Use - # str.join() as a way to cope with both. - self._make_partial(tp, nested) - continue - if decl.bitsize is None: - bitsize = -1 - else: - bitsize = self._parse_constant(decl.bitsize) - self._partial_length = False - type = self._get_type(decl.type, partial_length_ok=True) - if self._partial_length: - self._make_partial(tp, nested) - if isinstance(type, model.StructType) and type.partial: - self._make_partial(tp, nested) - fldnames.append(decl.name or '') - fldtypes.append(type) - fldbitsize.append(bitsize) - tp.fldnames = tuple(fldnames) - tp.fldtypes = tuple(fldtypes) - tp.fldbitsize = tuple(fldbitsize) - if fldbitsize != [-1] * len(fldbitsize): - if isinstance(tp, model.StructType) and tp.partial: - raise NotImplementedError("%s: using both bitfields and '...;'" - % (tp,)) - tp.packed = self._packed - return tp - - def _make_partial(self, tp, nested): - if not isinstance(tp, model.StructOrUnion): - raise api.CDefError("%s cannot be partial" % (tp,)) - if not tp.has_c_name() and not nested: - raise NotImplementedError("%s is partial but has no C name" %(tp,)) - tp.partial = True - - def _parse_constant(self, exprnode, partial_length_ok=False): - # for now, limited to expressions that are an immediate number - # or negative number - if isinstance(exprnode, pycparser.c_ast.Constant): - return int(exprnode.value, 0) - # - if (isinstance(exprnode, pycparser.c_ast.UnaryOp) and - exprnode.op == '-'): - return -self._parse_constant(exprnode.expr) - # load previously defined int constant - if (isinstance(exprnode, pycparser.c_ast.ID) and - exprnode.name in self._int_constants): - return self._int_constants[exprnode.name] - # - if partial_length_ok: - if (isinstance(exprnode, pycparser.c_ast.ID) and - exprnode.name == '__dotdotdotarray__'): - self._partial_length = True - return '...' - # - raise api.FFIError(":%d: unsupported expression: expected a " - "simple numeric constant" % exprnode.coord.line) - - def _build_enum_type(self, explicit_name, decls): - if decls is not None: - enumerators1 = [enum.name for enum in decls.enumerators] - enumerators = [s for s in enumerators1 - if not _r_enum_dotdotdot.match(s)] - partial = len(enumerators) < len(enumerators1) - enumerators = tuple(enumerators) - enumvalues = [] - nextenumvalue = 0 - for enum in decls.enumerators[:len(enumerators)]: - if enum.value is not None: - nextenumvalue = self._parse_constant(enum.value) - enumvalues.append(nextenumvalue) - self._add_constants(enum.name, nextenumvalue) - nextenumvalue += 1 - enumvalues = tuple(enumvalues) - tp = model.EnumType(explicit_name, enumerators, enumvalues) - tp.partial = partial - else: # opaque enum - tp = model.EnumType(explicit_name, (), ()) - return tp - - def include(self, other): - for name, tp in other._declarations.items(): - kind = name.split(' ', 1)[0] - if kind in ('typedef', 'struct', 'union', 'enum'): - self._declare(name, tp) - for k, v in other._int_constants.items(): - self._add_constants(k, v) diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/ffiplatform.py b/Linux_i686/lib/python3.4/site-packages/cffi/ffiplatform.py deleted file mode 100644 index 4515d6c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/ffiplatform.py +++ /dev/null @@ -1,112 +0,0 @@ -import os - - -class VerificationError(Exception): - """ An error raised when verification fails - """ - -class VerificationMissing(Exception): - """ An error raised when incomplete structures are passed into - cdef, but no verification has been done - """ - - -def get_extension(srcfilename, modname, sources=(), **kwds): - from distutils.core import Extension - allsources = [srcfilename] - allsources.extend(sources) - return Extension(name=modname, sources=allsources, **kwds) - -def compile(tmpdir, ext): - """Compile a C extension module using distutils.""" - - saved_environ = os.environ.copy() - try: - outputfilename = _build(tmpdir, ext) - outputfilename = os.path.abspath(outputfilename) - finally: - # workaround for a distutils bugs where some env vars can - # become longer and longer every time it is used - for key, value in saved_environ.items(): - if os.environ.get(key) != value: - os.environ[key] = value - return outputfilename - -def _build(tmpdir, ext): - # XXX compact but horrible :-( - from distutils.core import Distribution - import distutils.errors - # - dist = Distribution({'ext_modules': [ext]}) - dist.parse_config_files() - options = dist.get_option_dict('build_ext') - options['force'] = ('ffiplatform', True) - options['build_lib'] = ('ffiplatform', tmpdir) - options['build_temp'] = ('ffiplatform', tmpdir) - # - try: - dist.run_command('build_ext') - except (distutils.errors.CompileError, - distutils.errors.LinkError) as e: - raise VerificationError('%s: %s' % (e.__class__.__name__, e)) - # - cmd_obj = dist.get_command_obj('build_ext') - [soname] = cmd_obj.get_outputs() - return soname - -try: - from os.path import samefile -except ImportError: - def samefile(f1, f2): - return os.path.abspath(f1) == os.path.abspath(f2) - -def maybe_relative_path(path): - if not os.path.isabs(path): - return path # already relative - dir = path - names = [] - while True: - prevdir = dir - dir, name = os.path.split(prevdir) - if dir == prevdir or not dir: - return path # failed to make it relative - names.append(name) - try: - if samefile(dir, os.curdir): - names.reverse() - return os.path.join(*names) - except OSError: - pass - -# ____________________________________________________________ - -try: - int_or_long = (int, long) - import cStringIO -except NameError: - int_or_long = int # Python 3 - import io as cStringIO - -def _flatten(x, f): - if isinstance(x, str): - f.write('%ds%s' % (len(x), x)) - elif isinstance(x, dict): - keys = sorted(x.keys()) - f.write('%dd' % len(keys)) - for key in keys: - _flatten(key, f) - _flatten(x[key], f) - elif isinstance(x, (list, tuple)): - f.write('%dl' % len(x)) - for value in x: - _flatten(value, f) - elif isinstance(x, int_or_long): - f.write('%di' % (x,)) - else: - raise TypeError( - "the keywords to verify() contains unsupported object %r" % (x,)) - -def flatten(x): - f = cStringIO.StringIO() - _flatten(x, f) - return f.getvalue() diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/gc_weakref.py b/Linux_i686/lib/python3.4/site-packages/cffi/gc_weakref.py deleted file mode 100644 index a2c0967..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/gc_weakref.py +++ /dev/null @@ -1,19 +0,0 @@ -from weakref import ref - - -class GcWeakrefs(object): - # code copied and adapted from WeakKeyDictionary. - - def __init__(self, ffi): - self.ffi = ffi - self.data = data = {} - def remove(k): - destructor, cdata = data.pop(k) - destructor(cdata) - self.remove = remove - - def build(self, cdata, destructor): - # make a new cdata of the same type as the original one - new_cdata = self.ffi.cast(self.ffi._backend.typeof(cdata), cdata) - self.data[ref(new_cdata, self.remove)] = destructor, cdata - return new_cdata diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/lock.py b/Linux_i686/lib/python3.4/site-packages/cffi/lock.py deleted file mode 100644 index db91b71..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/lock.py +++ /dev/null @@ -1,30 +0,0 @@ -import sys - -if sys.version_info < (3,): - try: - from thread import allocate_lock - except ImportError: - from dummy_thread import allocate_lock -else: - try: - from _thread import allocate_lock - except ImportError: - from _dummy_thread import allocate_lock - - -##import sys -##l1 = allocate_lock - -##class allocate_lock(object): -## def __init__(self): -## self._real = l1() -## def __enter__(self): -## for i in range(4, 0, -1): -## print sys._getframe(i).f_code -## print -## return self._real.__enter__() -## def __exit__(self, *args): -## return self._real.__exit__(*args) -## def acquire(self, f): -## assert f is False -## return self._real.acquire(f) diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/model.py b/Linux_i686/lib/python3.4/site-packages/cffi/model.py deleted file mode 100644 index 371153f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/model.py +++ /dev/null @@ -1,499 +0,0 @@ -import types -import weakref - -from .lock import allocate_lock - - -class BaseTypeByIdentity(object): - is_array_type = False - is_raw_function = False - - def get_c_name(self, replace_with='', context='a C file'): - result = self.c_name_with_marker - assert result.count('&') == 1 - # some logic duplication with ffi.getctype()... :-( - replace_with = replace_with.strip() - if replace_with: - if replace_with.startswith('*') and '&[' in result: - replace_with = '(%s)' % replace_with - elif not replace_with[0] in '[(': - replace_with = ' ' + replace_with - result = result.replace('&', replace_with) - if '$' in result: - from .ffiplatform import VerificationError - raise VerificationError( - "cannot generate '%s' in %s: unknown type name" - % (self._get_c_name(), context)) - return result - - def _get_c_name(self): - return self.c_name_with_marker.replace('&', '') - - def has_c_name(self): - return '$' not in self._get_c_name() - - def get_cached_btype(self, ffi, finishlist, can_delay=False): - try: - BType = ffi._cached_btypes[self] - except KeyError: - BType = self.build_backend_type(ffi, finishlist) - BType2 = ffi._cached_btypes.setdefault(self, BType) - assert BType2 is BType - return BType - - def __repr__(self): - return '<%s>' % (self._get_c_name(),) - - def _get_items(self): - return [(name, getattr(self, name)) for name in self._attrs_] - - -class BaseType(BaseTypeByIdentity): - - def __eq__(self, other): - return (self.__class__ == other.__class__ and - self._get_items() == other._get_items()) - - def __ne__(self, other): - return not self == other - - def __hash__(self): - return hash((self.__class__, tuple(self._get_items()))) - - -class VoidType(BaseType): - _attrs_ = () - - def __init__(self): - self.c_name_with_marker = 'void&' - - def build_backend_type(self, ffi, finishlist): - return global_cache(self, ffi, 'new_void_type') - -void_type = VoidType() - - -class PrimitiveType(BaseType): - _attrs_ = ('name',) - - ALL_PRIMITIVE_TYPES = { - 'char': 'c', - 'short': 'i', - 'int': 'i', - 'long': 'i', - 'long long': 'i', - 'signed char': 'i', - 'unsigned char': 'i', - 'unsigned short': 'i', - 'unsigned int': 'i', - 'unsigned long': 'i', - 'unsigned long long': 'i', - 'float': 'f', - 'double': 'f', - 'long double': 'f', - '_Bool': 'i', - # the following types are not primitive in the C sense - 'wchar_t': 'c', - 'int8_t': 'i', - 'uint8_t': 'i', - 'int16_t': 'i', - 'uint16_t': 'i', - 'int32_t': 'i', - 'uint32_t': 'i', - 'int64_t': 'i', - 'uint64_t': 'i', - 'intptr_t': 'i', - 'uintptr_t': 'i', - 'ptrdiff_t': 'i', - 'size_t': 'i', - 'ssize_t': 'i', - } - - def __init__(self, name): - assert name in self.ALL_PRIMITIVE_TYPES - self.name = name - self.c_name_with_marker = name + '&' - - def is_char_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'c' - def is_integer_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'i' - def is_float_type(self): - return self.ALL_PRIMITIVE_TYPES[self.name] == 'f' - - def build_backend_type(self, ffi, finishlist): - return global_cache(self, ffi, 'new_primitive_type', self.name) - - -class BaseFunctionType(BaseType): - _attrs_ = ('args', 'result', 'ellipsis') - - def __init__(self, args, result, ellipsis): - self.args = args - self.result = result - self.ellipsis = ellipsis - # - reprargs = [arg._get_c_name() for arg in self.args] - if self.ellipsis: - reprargs.append('...') - reprargs = reprargs or ['void'] - replace_with = self._base_pattern % (', '.join(reprargs),) - self.c_name_with_marker = ( - self.result.c_name_with_marker.replace('&', replace_with)) - - -class RawFunctionType(BaseFunctionType): - # Corresponds to a C type like 'int(int)', which is the C type of - # a function, but not a pointer-to-function. The backend has no - # notion of such a type; it's used temporarily by parsing. - _base_pattern = '(&)(%s)' - is_raw_function = True - - def build_backend_type(self, ffi, finishlist): - from . import api - raise api.CDefError("cannot render the type %r: it is a function " - "type, not a pointer-to-function type" % (self,)) - - def as_function_pointer(self): - return FunctionPtrType(self.args, self.result, self.ellipsis) - - -class FunctionPtrType(BaseFunctionType): - _base_pattern = '(*&)(%s)' - - def build_backend_type(self, ffi, finishlist): - result = self.result.get_cached_btype(ffi, finishlist) - args = [] - for tp in self.args: - args.append(tp.get_cached_btype(ffi, finishlist)) - return global_cache(self, ffi, 'new_function_type', - tuple(args), result, self.ellipsis) - - -class PointerType(BaseType): - _attrs_ = ('totype',) - _base_pattern = " *&" - _base_pattern_array = "(*&)" - - def __init__(self, totype): - self.totype = totype - if totype.is_array_type: - extra = self._base_pattern_array - else: - extra = self._base_pattern - self.c_name_with_marker = totype.c_name_with_marker.replace('&', extra) - - def build_backend_type(self, ffi, finishlist): - BItem = self.totype.get_cached_btype(ffi, finishlist, can_delay=True) - return global_cache(self, ffi, 'new_pointer_type', BItem) - -voidp_type = PointerType(void_type) - - -class ConstPointerType(PointerType): - _base_pattern = " const *&" - _base_pattern_array = "(const *&)" - -const_voidp_type = ConstPointerType(void_type) - - -class NamedPointerType(PointerType): - _attrs_ = ('totype', 'name') - - def __init__(self, totype, name): - PointerType.__init__(self, totype) - self.name = name - self.c_name_with_marker = name + '&' - - -class ArrayType(BaseType): - _attrs_ = ('item', 'length') - is_array_type = True - - def __init__(self, item, length): - self.item = item - self.length = length - # - if length is None: - brackets = '&[]' - elif length == '...': - brackets = '&[/*...*/]' - else: - brackets = '&[%d]' % length - self.c_name_with_marker = ( - self.item.c_name_with_marker.replace('&', brackets)) - - def resolve_length(self, newlength): - return ArrayType(self.item, newlength) - - def build_backend_type(self, ffi, finishlist): - if self.length == '...': - from . import api - raise api.CDefError("cannot render the type %r: unknown length" % - (self,)) - self.item.get_cached_btype(ffi, finishlist) # force the item BType - BPtrItem = PointerType(self.item).get_cached_btype(ffi, finishlist) - return global_cache(self, ffi, 'new_array_type', BPtrItem, self.length) - - -class StructOrUnionOrEnum(BaseTypeByIdentity): - _attrs_ = ('name',) - forcename = None - - def build_c_name_with_marker(self): - name = self.forcename or '%s %s' % (self.kind, self.name) - self.c_name_with_marker = name + '&' - - def force_the_name(self, forcename): - self.forcename = forcename - self.build_c_name_with_marker() - - def get_official_name(self): - assert self.c_name_with_marker.endswith('&') - return self.c_name_with_marker[:-1] - - -class StructOrUnion(StructOrUnionOrEnum): - fixedlayout = None - completed = False - partial = False - packed = False - - def __init__(self, name, fldnames, fldtypes, fldbitsize): - self.name = name - self.fldnames = fldnames - self.fldtypes = fldtypes - self.fldbitsize = fldbitsize - self.build_c_name_with_marker() - - def enumfields(self): - for name, type, bitsize in zip(self.fldnames, self.fldtypes, - self.fldbitsize): - if name == '' and isinstance(type, StructOrUnion): - # nested anonymous struct/union - for result in type.enumfields(): - yield result - else: - yield (name, type, bitsize) - - def force_flatten(self): - # force the struct or union to have a declaration that lists - # directly all fields returned by enumfields(), flattening - # nested anonymous structs/unions. - names = [] - types = [] - bitsizes = [] - for name, type, bitsize in self.enumfields(): - names.append(name) - types.append(type) - bitsizes.append(bitsize) - self.fldnames = tuple(names) - self.fldtypes = tuple(types) - self.fldbitsize = tuple(bitsizes) - - def get_cached_btype(self, ffi, finishlist, can_delay=False): - BType = StructOrUnionOrEnum.get_cached_btype(self, ffi, finishlist, - can_delay) - if not can_delay: - self.finish_backend_type(ffi, finishlist) - return BType - - def finish_backend_type(self, ffi, finishlist): - if self.completed: - if self.completed != 2: - raise NotImplementedError("recursive structure declaration " - "for '%s'" % (self.name,)) - return - BType = ffi._cached_btypes[self] - if self.fldtypes is None: - return # not completing it: it's an opaque struct - # - self.completed = 1 - # - if self.fixedlayout is None: - fldtypes = [tp.get_cached_btype(ffi, finishlist) - for tp in self.fldtypes] - lst = list(zip(self.fldnames, fldtypes, self.fldbitsize)) - sflags = 0 - if self.packed: - sflags = 8 # SF_PACKED - ffi._backend.complete_struct_or_union(BType, lst, self, - -1, -1, sflags) - # - else: - fldtypes = [] - fieldofs, fieldsize, totalsize, totalalignment = self.fixedlayout - for i in range(len(self.fldnames)): - fsize = fieldsize[i] - ftype = self.fldtypes[i] - # - if isinstance(ftype, ArrayType) and ftype.length == '...': - # fix the length to match the total size - BItemType = ftype.item.get_cached_btype(ffi, finishlist) - nlen, nrest = divmod(fsize, ffi.sizeof(BItemType)) - if nrest != 0: - self._verification_error( - "field '%s.%s' has a bogus size?" % ( - self.name, self.fldnames[i] or '{}')) - ftype = ftype.resolve_length(nlen) - self.fldtypes = (self.fldtypes[:i] + (ftype,) + - self.fldtypes[i+1:]) - # - BFieldType = ftype.get_cached_btype(ffi, finishlist) - if isinstance(ftype, ArrayType) and ftype.length is None: - assert fsize == 0 - else: - bitemsize = ffi.sizeof(BFieldType) - if bitemsize != fsize: - self._verification_error( - "field '%s.%s' is declared as %d bytes, but is " - "really %d bytes" % (self.name, - self.fldnames[i] or '{}', - bitemsize, fsize)) - fldtypes.append(BFieldType) - # - lst = list(zip(self.fldnames, fldtypes, self.fldbitsize, fieldofs)) - ffi._backend.complete_struct_or_union(BType, lst, self, - totalsize, totalalignment) - self.completed = 2 - - def _verification_error(self, msg): - from .ffiplatform import VerificationError - raise VerificationError(msg) - - def check_not_partial(self): - if self.partial and self.fixedlayout is None: - from . import ffiplatform - raise ffiplatform.VerificationMissing(self._get_c_name()) - - def build_backend_type(self, ffi, finishlist): - self.check_not_partial() - finishlist.append(self) - # - return global_cache(self, ffi, 'new_%s_type' % self.kind, - self.get_official_name(), key=self) - - -class StructType(StructOrUnion): - kind = 'struct' - - -class UnionType(StructOrUnion): - kind = 'union' - - -class EnumType(StructOrUnionOrEnum): - kind = 'enum' - partial = False - partial_resolved = False - - def __init__(self, name, enumerators, enumvalues, baseinttype=None): - self.name = name - self.enumerators = enumerators - self.enumvalues = enumvalues - self.baseinttype = baseinttype - self.build_c_name_with_marker() - - def force_the_name(self, forcename): - StructOrUnionOrEnum.force_the_name(self, forcename) - if self.forcename is None: - name = self.get_official_name() - self.forcename = '$' + name.replace(' ', '_') - - def check_not_partial(self): - if self.partial and not self.partial_resolved: - from . import ffiplatform - raise ffiplatform.VerificationMissing(self._get_c_name()) - - def build_backend_type(self, ffi, finishlist): - self.check_not_partial() - base_btype = self.build_baseinttype(ffi, finishlist) - return global_cache(self, ffi, 'new_enum_type', - self.get_official_name(), - self.enumerators, self.enumvalues, - base_btype, key=self) - - def build_baseinttype(self, ffi, finishlist): - if self.baseinttype is not None: - return self.baseinttype.get_cached_btype(ffi, finishlist) - # - if self.enumvalues: - smallest_value = min(self.enumvalues) - largest_value = max(self.enumvalues) - else: - smallest_value = 0 - largest_value = 0 - if smallest_value < 0: # needs a signed type - sign = 1 - candidate1 = PrimitiveType("int") - candidate2 = PrimitiveType("long") - else: - sign = 0 - candidate1 = PrimitiveType("unsigned int") - candidate2 = PrimitiveType("unsigned long") - btype1 = candidate1.get_cached_btype(ffi, finishlist) - btype2 = candidate2.get_cached_btype(ffi, finishlist) - size1 = ffi.sizeof(btype1) - size2 = ffi.sizeof(btype2) - if (smallest_value >= ((-1) << (8*size1-1)) and - largest_value < (1 << (8*size1-sign))): - return btype1 - if (smallest_value >= ((-1) << (8*size2-1)) and - largest_value < (1 << (8*size2-sign))): - return btype2 - raise api.CDefError("%s values don't all fit into either 'long' " - "or 'unsigned long'" % self._get_c_name()) - -def unknown_type(name, structname=None): - if structname is None: - structname = '$%s' % name - tp = StructType(structname, None, None, None) - tp.force_the_name(name) - return tp - -def unknown_ptr_type(name, structname=None): - if structname is None: - structname = '*$%s' % name - tp = StructType(structname, None, None, None) - return NamedPointerType(tp, name) - - -global_lock = allocate_lock() - -def global_cache(srctype, ffi, funcname, *args, **kwds): - key = kwds.pop('key', (funcname, args)) - assert not kwds - try: - return ffi._backend.__typecache[key] - except KeyError: - pass - except AttributeError: - # initialize the __typecache attribute, either at the module level - # if ffi._backend is a module, or at the class level if ffi._backend - # is some instance. - if isinstance(ffi._backend, types.ModuleType): - ffi._backend.__typecache = weakref.WeakValueDictionary() - else: - type(ffi._backend).__typecache = weakref.WeakValueDictionary() - try: - res = getattr(ffi._backend, funcname)(*args) - except NotImplementedError as e: - raise NotImplementedError("%r: %s" % (srctype, e)) - # note that setdefault() on WeakValueDictionary is not atomic - # and contains a rare bug (http://bugs.python.org/issue19542); - # we have to use a lock and do it ourselves - cache = ffi._backend.__typecache - with global_lock: - res1 = cache.get(key) - if res1 is None: - cache[key] = res - return res - else: - return res1 - -def pointer_cache(ffi, BType): - return global_cache('?', ffi, 'new_pointer_type', BType) - -def attach_exception_info(e, name): - if e.args and type(e.args[0]) is str: - e.args = ('%s: %s' % (name, e.args[0]),) + e.args[1:] diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/vengine_cpy.py b/Linux_i686/lib/python3.4/site-packages/cffi/vengine_cpy.py deleted file mode 100644 index 31793f0..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/vengine_cpy.py +++ /dev/null @@ -1,951 +0,0 @@ -import sys, imp -from . import model, ffiplatform - - -class VCPythonEngine(object): - _class_key = 'x' - _gen_python_module = True - - def __init__(self, verifier): - self.verifier = verifier - self.ffi = verifier.ffi - self._struct_pending_verification = {} - self._types_of_builtin_functions = {} - - def patch_extension_kwds(self, kwds): - pass - - def find_module(self, module_name, path, so_suffixes): - try: - f, filename, descr = imp.find_module(module_name, path) - except ImportError: - return None - if f is not None: - f.close() - # Note that after a setuptools installation, there are both .py - # and .so files with the same basename. The code here relies on - # imp.find_module() locating the .so in priority. - if descr[0] not in so_suffixes: - return None - return filename - - def collect_types(self): - self._typesdict = {} - self._generate("collecttype") - - def _prnt(self, what=''): - self._f.write(what + '\n') - - def _gettypenum(self, type): - # a KeyError here is a bug. please report it! :-) - return self._typesdict[type] - - def _do_collect_type(self, tp): - if ((not isinstance(tp, model.PrimitiveType) - or tp.name == 'long double') - and tp not in self._typesdict): - num = len(self._typesdict) - self._typesdict[tp] = num - - def write_source_to_f(self): - self.collect_types() - # - # The new module will have a _cffi_setup() function that receives - # objects from the ffi world, and that calls some setup code in - # the module. This setup code is split in several independent - # functions, e.g. one per constant. The functions are "chained" - # by ending in a tail call to each other. - # - # This is further split in two chained lists, depending on if we - # can do it at import-time or if we must wait for _cffi_setup() to - # provide us with the objects. This is needed because we - # need the values of the enum constants in order to build the - # that we may have to pass to _cffi_setup(). - # - # The following two 'chained_list_constants' items contains - # the head of these two chained lists, as a string that gives the - # call to do, if any. - self._chained_list_constants = ['0', '0'] - # - prnt = self._prnt - # first paste some standard set of lines that are mostly '#define' - prnt(cffimod_header) - prnt() - # then paste the C source given by the user, verbatim. - prnt(self.verifier.preamble) - prnt() - # - # call generate_cpy_xxx_decl(), for every xxx found from - # ffi._parser._declarations. This generates all the functions. - self._generate("decl") - # - # implement the function _cffi_setup_custom() as calling the - # head of the chained list. - self._generate_setup_custom() - prnt() - # - # produce the method table, including the entries for the - # generated Python->C function wrappers, which are done - # by generate_cpy_function_method(). - prnt('static PyMethodDef _cffi_methods[] = {') - self._generate("method") - prnt(' {"_cffi_setup", _cffi_setup, METH_VARARGS, NULL},') - prnt(' {NULL, NULL, 0, NULL} /* Sentinel */') - prnt('};') - prnt() - # - # standard init. - modname = self.verifier.get_module_name() - constants = self._chained_list_constants[False] - prnt('#if PY_MAJOR_VERSION >= 3') - prnt() - prnt('static struct PyModuleDef _cffi_module_def = {') - prnt(' PyModuleDef_HEAD_INIT,') - prnt(' "%s",' % modname) - prnt(' NULL,') - prnt(' -1,') - prnt(' _cffi_methods,') - prnt(' NULL, NULL, NULL, NULL') - prnt('};') - prnt() - prnt('PyMODINIT_FUNC') - prnt('PyInit_%s(void)' % modname) - prnt('{') - prnt(' PyObject *lib;') - prnt(' lib = PyModule_Create(&_cffi_module_def);') - prnt(' if (lib == NULL)') - prnt(' return NULL;') - prnt(' if (%s < 0 || _cffi_init() < 0) {' % (constants,)) - prnt(' Py_DECREF(lib);') - prnt(' return NULL;') - prnt(' }') - prnt(' return lib;') - prnt('}') - prnt() - prnt('#else') - prnt() - prnt('PyMODINIT_FUNC') - prnt('init%s(void)' % modname) - prnt('{') - prnt(' PyObject *lib;') - prnt(' lib = Py_InitModule("%s", _cffi_methods);' % modname) - prnt(' if (lib == NULL)') - prnt(' return;') - prnt(' if (%s < 0 || _cffi_init() < 0)' % (constants,)) - prnt(' return;') - prnt(' return;') - prnt('}') - prnt() - prnt('#endif') - - def load_library(self): - # XXX review all usages of 'self' here! - # import it as a new extension module - try: - module = imp.load_dynamic(self.verifier.get_module_name(), - self.verifier.modulefilename) - except ImportError as e: - error = "importing %r: %s" % (self.verifier.modulefilename, e) - raise ffiplatform.VerificationError(error) - # - # call loading_cpy_struct() to get the struct layout inferred by - # the C compiler - self._load(module, 'loading') - # - # the C code will need the objects. Collect them in - # order in a list. - revmapping = dict([(value, key) - for (key, value) in self._typesdict.items()]) - lst = [revmapping[i] for i in range(len(revmapping))] - lst = list(map(self.ffi._get_cached_btype, lst)) - # - # build the FFILibrary class and instance and call _cffi_setup(). - # this will set up some fields like '_cffi_types', and only then - # it will invoke the chained list of functions that will really - # build (notably) the constant objects, as if they are - # pointers, and store them as attributes on the 'library' object. - class FFILibrary(object): - _cffi_python_module = module - _cffi_ffi = self.ffi - _cffi_dir = [] - def __dir__(self): - return FFILibrary._cffi_dir + list(self.__dict__) - library = FFILibrary() - if module._cffi_setup(lst, ffiplatform.VerificationError, library): - import warnings - warnings.warn("reimporting %r might overwrite older definitions" - % (self.verifier.get_module_name())) - # - # finally, call the loaded_cpy_xxx() functions. This will perform - # the final adjustments, like copying the Python->C wrapper - # functions from the module to the 'library' object, and setting - # up the FFILibrary class with properties for the global C variables. - self._load(module, 'loaded', library=library) - module._cffi_original_ffi = self.ffi - module._cffi_types_of_builtin_funcs = self._types_of_builtin_functions - return library - - def _get_declarations(self): - return sorted(self.ffi._parser._declarations.items()) - - def _generate(self, step_name): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - try: - method = getattr(self, '_generate_cpy_%s_%s' % (kind, - step_name)) - except AttributeError: - raise ffiplatform.VerificationError( - "not implemented in verify(): %r" % name) - try: - method(tp, realname) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _load(self, module, step_name, **kwds): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - method = getattr(self, '_%s_cpy_%s' % (step_name, kind)) - try: - method(tp, realname, module, **kwds) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _generate_nothing(self, tp, name): - pass - - def _loaded_noop(self, tp, name, module, **kwds): - pass - - # ---------- - - def _convert_funcarg_to_c(self, tp, fromvar, tovar, errcode): - extraarg = '' - if isinstance(tp, model.PrimitiveType): - if tp.is_integer_type() and tp.name != '_Bool': - converter = '_cffi_to_c_int' - extraarg = ', %s' % tp.name - else: - converter = '_cffi_to_c_%s' % (tp.name.replace(' ', '_'),) - errvalue = '-1' - # - elif isinstance(tp, model.PointerType): - self._convert_funcarg_to_c_ptr_or_array(tp, fromvar, - tovar, errcode) - return - # - elif isinstance(tp, (model.StructOrUnion, model.EnumType)): - # a struct (not a struct pointer) as a function argument - self._prnt(' if (_cffi_to_c((char *)&%s, _cffi_type(%d), %s) < 0)' - % (tovar, self._gettypenum(tp), fromvar)) - self._prnt(' %s;' % errcode) - return - # - elif isinstance(tp, model.FunctionPtrType): - converter = '(%s)_cffi_to_c_pointer' % tp.get_c_name('') - extraarg = ', _cffi_type(%d)' % self._gettypenum(tp) - errvalue = 'NULL' - # - else: - raise NotImplementedError(tp) - # - self._prnt(' %s = %s(%s%s);' % (tovar, converter, fromvar, extraarg)) - self._prnt(' if (%s == (%s)%s && PyErr_Occurred())' % ( - tovar, tp.get_c_name(''), errvalue)) - self._prnt(' %s;' % errcode) - - def _extra_local_variables(self, tp, localvars): - if isinstance(tp, model.PointerType): - localvars.add('Py_ssize_t datasize') - - def _convert_funcarg_to_c_ptr_or_array(self, tp, fromvar, tovar, errcode): - self._prnt(' datasize = _cffi_prepare_pointer_call_argument(') - self._prnt(' _cffi_type(%d), %s, (char **)&%s);' % ( - self._gettypenum(tp), fromvar, tovar)) - self._prnt(' if (datasize != 0) {') - self._prnt(' if (datasize < 0)') - self._prnt(' %s;' % errcode) - self._prnt(' %s = alloca(datasize);' % (tovar,)) - self._prnt(' memset((void *)%s, 0, datasize);' % (tovar,)) - self._prnt(' if (_cffi_convert_array_from_object(' - '(char *)%s, _cffi_type(%d), %s) < 0)' % ( - tovar, self._gettypenum(tp), fromvar)) - self._prnt(' %s;' % errcode) - self._prnt(' }') - - def _convert_expr_from_c(self, tp, var, context): - if isinstance(tp, model.PrimitiveType): - if tp.is_integer_type(): - return '_cffi_from_c_int(%s, %s)' % (var, tp.name) - elif tp.name != 'long double': - return '_cffi_from_c_%s(%s)' % (tp.name.replace(' ', '_'), var) - else: - return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, (model.PointerType, model.FunctionPtrType)): - return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, model.ArrayType): - return '_cffi_from_c_pointer((char *)%s, _cffi_type(%d))' % ( - var, self._gettypenum(model.PointerType(tp.item))) - elif isinstance(tp, model.StructType): - if tp.fldnames is None: - raise TypeError("'%s' is used as %s, but is opaque" % ( - tp._get_c_name(), context)) - return '_cffi_from_c_struct((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - elif isinstance(tp, model.EnumType): - return '_cffi_from_c_deref((char *)&%s, _cffi_type(%d))' % ( - var, self._gettypenum(tp)) - else: - raise NotImplementedError(tp) - - # ---------- - # typedefs: generates no code so far - - _generate_cpy_typedef_collecttype = _generate_nothing - _generate_cpy_typedef_decl = _generate_nothing - _generate_cpy_typedef_method = _generate_nothing - _loading_cpy_typedef = _loaded_noop - _loaded_cpy_typedef = _loaded_noop - - # ---------- - # function declarations - - def _generate_cpy_function_collecttype(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - self._do_collect_type(tp) - else: - # don't call _do_collect_type(tp) in this common case, - # otherwise test_autofilled_struct_as_argument fails - for type in tp.args: - self._do_collect_type(type) - self._do_collect_type(tp.result) - - def _generate_cpy_function_decl(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - # cannot support vararg functions better than this: check for its - # exact type (including the fixed arguments), and build it as a - # constant function pointer (no CPython wrapper) - self._generate_cpy_const(False, name, tp) - return - prnt = self._prnt - numargs = len(tp.args) - if numargs == 0: - argname = 'no_arg' - elif numargs == 1: - argname = 'arg0' - else: - argname = 'args' - prnt('static PyObject *') - prnt('_cffi_f_%s(PyObject *self, PyObject *%s)' % (name, argname)) - prnt('{') - # - context = 'argument of %s' % name - for i, type in enumerate(tp.args): - prnt(' %s;' % type.get_c_name(' x%d' % i, context)) - # - localvars = set() - for type in tp.args: - self._extra_local_variables(type, localvars) - for decl in localvars: - prnt(' %s;' % (decl,)) - # - if not isinstance(tp.result, model.VoidType): - result_code = 'result = ' - context = 'result of %s' % name - prnt(' %s;' % tp.result.get_c_name(' result', context)) - else: - result_code = '' - # - if len(tp.args) > 1: - rng = range(len(tp.args)) - for i in rng: - prnt(' PyObject *arg%d;' % i) - prnt() - prnt(' if (!PyArg_ParseTuple(args, "%s:%s", %s))' % ( - 'O' * numargs, name, ', '.join(['&arg%d' % i for i in rng]))) - prnt(' return NULL;') - prnt() - # - for i, type in enumerate(tp.args): - self._convert_funcarg_to_c(type, 'arg%d' % i, 'x%d' % i, - 'return NULL') - prnt() - # - prnt(' Py_BEGIN_ALLOW_THREADS') - prnt(' _cffi_restore_errno();') - prnt(' { %s%s(%s); }' % ( - result_code, name, - ', '.join(['x%d' % i for i in range(len(tp.args))]))) - prnt(' _cffi_save_errno();') - prnt(' Py_END_ALLOW_THREADS') - prnt() - # - if result_code: - prnt(' return %s;' % - self._convert_expr_from_c(tp.result, 'result', 'result type')) - else: - prnt(' Py_INCREF(Py_None);') - prnt(' return Py_None;') - prnt('}') - prnt() - - def _generate_cpy_function_method(self, tp, name): - if tp.ellipsis: - return - numargs = len(tp.args) - if numargs == 0: - meth = 'METH_NOARGS' - elif numargs == 1: - meth = 'METH_O' - else: - meth = 'METH_VARARGS' - self._prnt(' {"%s", _cffi_f_%s, %s, NULL},' % (name, name, meth)) - - _loading_cpy_function = _loaded_noop - - def _loaded_cpy_function(self, tp, name, module, library): - if tp.ellipsis: - return - func = getattr(module, name) - setattr(library, name, func) - self._types_of_builtin_functions[func] = tp - - # ---------- - # named structs - - _generate_cpy_struct_collecttype = _generate_nothing - def _generate_cpy_struct_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'struct', name) - def _generate_cpy_struct_method(self, tp, name): - self._generate_struct_or_union_method(tp, 'struct', name) - def _loading_cpy_struct(self, tp, name, module): - self._loading_struct_or_union(tp, 'struct', name, module) - def _loaded_cpy_struct(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - _generate_cpy_union_collecttype = _generate_nothing - def _generate_cpy_union_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'union', name) - def _generate_cpy_union_method(self, tp, name): - self._generate_struct_or_union_method(tp, 'union', name) - def _loading_cpy_union(self, tp, name, module): - self._loading_struct_or_union(tp, 'union', name, module) - def _loaded_cpy_union(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - def _generate_struct_or_union_decl(self, tp, prefix, name): - if tp.fldnames is None: - return # nothing to do with opaque structs - checkfuncname = '_cffi_check_%s_%s' % (prefix, name) - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - cname = ('%s %s' % (prefix, name)).strip() - # - prnt = self._prnt - prnt('static void %s(%s *p)' % (checkfuncname, cname)) - prnt('{') - prnt(' /* only to generate compile-time warnings or errors */') - for fname, ftype, fbitsize in tp.enumfields(): - if (isinstance(ftype, model.PrimitiveType) - and ftype.is_integer_type()) or fbitsize >= 0: - # accept all integers, but complain on float or double - prnt(' (void)((p->%s) << 1);' % fname) - else: - # only accept exactly the type declared. - try: - prnt(' { %s = &p->%s; (void)tmp; }' % ( - ftype.get_c_name('*tmp', 'field %r'%fname), fname)) - except ffiplatform.VerificationError as e: - prnt(' /* %s */' % str(e)) # cannot verify it, ignore - prnt('}') - prnt('static PyObject *') - prnt('%s(PyObject *self, PyObject *noarg)' % (layoutfuncname,)) - prnt('{') - prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) - prnt(' static Py_ssize_t nums[] = {') - prnt(' sizeof(%s),' % cname) - prnt(' offsetof(struct _cffi_aligncheck, y),') - for fname, ftype, fbitsize in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - prnt(' offsetof(%s, %s),' % (cname, fname)) - if isinstance(ftype, model.ArrayType) and ftype.length is None: - prnt(' 0, /* %s */' % ftype._get_c_name()) - else: - prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) - prnt(' -1') - prnt(' };') - prnt(' return _cffi_get_struct_layout(nums);') - prnt(' /* the next line is not executed, but compiled */') - prnt(' %s(0);' % (checkfuncname,)) - prnt('}') - prnt() - - def _generate_struct_or_union_method(self, tp, prefix, name): - if tp.fldnames is None: - return # nothing to do with opaque structs - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - self._prnt(' {"%s", %s, METH_NOARGS, NULL},' % (layoutfuncname, - layoutfuncname)) - - def _loading_struct_or_union(self, tp, prefix, name, module): - if tp.fldnames is None: - return # nothing to do with opaque structs - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - # - function = getattr(module, layoutfuncname) - layout = function() - if isinstance(tp, model.StructOrUnion) and tp.partial: - # use the function()'s sizes and offsets to guide the - # layout of the struct - totalsize = layout[0] - totalalignment = layout[1] - fieldofs = layout[2::2] - fieldsize = layout[3::2] - tp.force_flatten() - assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) - tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment - else: - cname = ('%s %s' % (prefix, name)).strip() - self._struct_pending_verification[tp] = layout, cname - - def _loaded_struct_or_union(self, tp): - if tp.fldnames is None: - return # nothing to do with opaque structs - self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered - - if tp in self._struct_pending_verification: - # check that the layout sizes and offsets match the real ones - def check(realvalue, expectedvalue, msg): - if realvalue != expectedvalue: - raise ffiplatform.VerificationError( - "%s (we have %d, but C compiler says %d)" - % (msg, expectedvalue, realvalue)) - ffi = self.ffi - BStruct = ffi._get_cached_btype(tp) - layout, cname = self._struct_pending_verification.pop(tp) - check(layout[0], ffi.sizeof(BStruct), "wrong total size") - check(layout[1], ffi.alignof(BStruct), "wrong total alignment") - i = 2 - for fname, ftype, fbitsize in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - check(layout[i], ffi.offsetof(BStruct, fname), - "wrong offset for field %r" % (fname,)) - if layout[i+1] != 0: - BField = ffi._get_cached_btype(ftype) - check(layout[i+1], ffi.sizeof(BField), - "wrong size for field %r" % (fname,)) - i += 2 - assert i == len(layout) - - # ---------- - # 'anonymous' declarations. These are produced for anonymous structs - # or unions; the 'name' is obtained by a typedef. - - _generate_cpy_anonymous_collecttype = _generate_nothing - - def _generate_cpy_anonymous_decl(self, tp, name): - if isinstance(tp, model.EnumType): - self._generate_cpy_enum_decl(tp, name, '') - else: - self._generate_struct_or_union_decl(tp, '', name) - - def _generate_cpy_anonymous_method(self, tp, name): - if not isinstance(tp, model.EnumType): - self._generate_struct_or_union_method(tp, '', name) - - def _loading_cpy_anonymous(self, tp, name, module): - if isinstance(tp, model.EnumType): - self._loading_cpy_enum(tp, name, module) - else: - self._loading_struct_or_union(tp, '', name, module) - - def _loaded_cpy_anonymous(self, tp, name, module, **kwds): - if isinstance(tp, model.EnumType): - self._loaded_cpy_enum(tp, name, module, **kwds) - else: - self._loaded_struct_or_union(tp) - - # ---------- - # constants, likely declared with '#define' - - def _generate_cpy_const(self, is_int, name, tp=None, category='const', - vartp=None, delayed=True, size_too=False): - prnt = self._prnt - funcname = '_cffi_%s_%s' % (category, name) - prnt('static int %s(PyObject *lib)' % funcname) - prnt('{') - prnt(' PyObject *o;') - prnt(' int res;') - if not is_int: - prnt(' %s;' % (vartp or tp).get_c_name(' i', name)) - else: - assert category == 'const' - # - if not is_int: - if category == 'var': - realexpr = '&' + name - else: - realexpr = name - prnt(' i = (%s);' % (realexpr,)) - prnt(' o = %s;' % (self._convert_expr_from_c(tp, 'i', - 'variable type'),)) - assert delayed - else: - prnt(' o = _cffi_from_c_int_const(%s);' % name) - prnt(' if (o == NULL)') - prnt(' return -1;') - if size_too: - prnt(' {') - prnt(' PyObject *o1 = o;') - prnt(' o = Py_BuildValue("On", o1, (Py_ssize_t)sizeof(%s));' - % (name,)) - prnt(' Py_DECREF(o1);') - prnt(' if (o == NULL)') - prnt(' return -1;') - prnt(' }') - prnt(' res = PyObject_SetAttrString(lib, "%s", o);' % name) - prnt(' Py_DECREF(o);') - prnt(' if (res < 0)') - prnt(' return -1;') - prnt(' return %s;' % self._chained_list_constants[delayed]) - self._chained_list_constants[delayed] = funcname + '(lib)' - prnt('}') - prnt() - - def _generate_cpy_constant_collecttype(self, tp, name): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - if not is_int: - self._do_collect_type(tp) - - def _generate_cpy_constant_decl(self, tp, name): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - self._generate_cpy_const(is_int, name, tp) - - _generate_cpy_constant_method = _generate_nothing - _loading_cpy_constant = _loaded_noop - _loaded_cpy_constant = _loaded_noop - - # ---------- - # enums - - def _enum_funcname(self, prefix, name): - # "$enum_$1" => "___D_enum____D_1" - name = name.replace('$', '___D_') - return '_cffi_e_%s_%s' % (prefix, name) - - def _generate_cpy_enum_decl(self, tp, name, prefix='enum'): - if tp.partial: - for enumerator in tp.enumerators: - self._generate_cpy_const(True, enumerator, delayed=False) - return - # - funcname = self._enum_funcname(prefix, name) - prnt = self._prnt - prnt('static int %s(PyObject *lib)' % funcname) - prnt('{') - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - if enumvalue < 0: - prnt(' if ((%s) >= 0 || (long)(%s) != %dL) {' % ( - enumerator, enumerator, enumvalue)) - else: - prnt(' if ((%s) < 0 || (unsigned long)(%s) != %dUL) {' % ( - enumerator, enumerator, enumvalue)) - prnt(' char buf[64];') - prnt(' if ((%s) < 0)' % enumerator) - prnt(' snprintf(buf, 63, "%%ld", (long)(%s));' % enumerator) - prnt(' else') - prnt(' snprintf(buf, 63, "%%lu", (unsigned long)(%s));' % - enumerator) - prnt(' PyErr_Format(_cffi_VerificationError,') - prnt(' "enum %s: %s has the real value %s, ' - 'not %s",') - prnt(' "%s", "%s", buf, "%d");' % ( - name, enumerator, enumvalue)) - prnt(' return -1;') - prnt(' }') - prnt(' return %s;' % self._chained_list_constants[True]) - self._chained_list_constants[True] = funcname + '(lib)' - prnt('}') - prnt() - - _generate_cpy_enum_collecttype = _generate_nothing - _generate_cpy_enum_method = _generate_nothing - - def _loading_cpy_enum(self, tp, name, module): - if tp.partial: - enumvalues = [getattr(module, enumerator) - for enumerator in tp.enumerators] - tp.enumvalues = tuple(enumvalues) - tp.partial_resolved = True - - def _loaded_cpy_enum(self, tp, name, module, library): - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - setattr(library, enumerator, enumvalue) - - # ---------- - # macros: for now only for integers - - def _generate_cpy_macro_decl(self, tp, name): - assert tp == '...' - self._generate_cpy_const(True, name) - - _generate_cpy_macro_collecttype = _generate_nothing - _generate_cpy_macro_method = _generate_nothing - _loading_cpy_macro = _loaded_noop - _loaded_cpy_macro = _loaded_noop - - # ---------- - # global variables - - def _generate_cpy_variable_collecttype(self, tp, name): - if isinstance(tp, model.ArrayType): - tp_ptr = model.PointerType(tp.item) - else: - tp_ptr = model.PointerType(tp) - self._do_collect_type(tp_ptr) - - def _generate_cpy_variable_decl(self, tp, name): - if isinstance(tp, model.ArrayType): - tp_ptr = model.PointerType(tp.item) - self._generate_cpy_const(False, name, tp, vartp=tp_ptr, - size_too = (tp.length == '...')) - else: - tp_ptr = model.PointerType(tp) - self._generate_cpy_const(False, name, tp_ptr, category='var') - - _generate_cpy_variable_method = _generate_nothing - _loading_cpy_variable = _loaded_noop - - def _loaded_cpy_variable(self, tp, name, module, library): - value = getattr(library, name) - if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the - # sense that "a=..." is forbidden - if tp.length == '...': - assert isinstance(value, tuple) - (value, size) = value - BItemType = self.ffi._get_cached_btype(tp.item) - length, rest = divmod(size, self.ffi.sizeof(BItemType)) - if rest != 0: - raise ffiplatform.VerificationError( - "bad size: %r does not seem to be an array of %s" % - (name, tp.item)) - tp = tp.resolve_length(length) - # 'value' is a which we have to replace with - # a if the N is actually known - if tp.length is not None: - BArray = self.ffi._get_cached_btype(tp) - value = self.ffi.cast(BArray, value) - setattr(library, name, value) - return - # remove ptr= from the library instance, and replace - # it by a property on the class, which reads/writes into ptr[0]. - ptr = value - delattr(library, name) - def getter(library): - return ptr[0] - def setter(library, value): - ptr[0] = value - setattr(type(library), name, property(getter, setter)) - type(library)._cffi_dir.append(name) - - # ---------- - - def _generate_setup_custom(self): - prnt = self._prnt - prnt('static int _cffi_setup_custom(PyObject *lib)') - prnt('{') - prnt(' return %s;' % self._chained_list_constants[True]) - prnt('}') - -cffimod_header = r''' -#include -#include - -/* this block of #ifs should be kept exactly identical between - c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py */ -#if defined(_MSC_VER) -# include /* for alloca() */ -# if _MSC_VER < 1600 /* MSVC < 2010 */ - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; -# else -# include -# endif -# if _MSC_VER < 1800 /* MSVC < 2013 */ - typedef unsigned char _Bool; -# endif -#else -# include -# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) -# include -# endif -#endif - -#if PY_MAJOR_VERSION < 3 -# undef PyCapsule_CheckExact -# undef PyCapsule_GetPointer -# define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) -# define PyCapsule_GetPointer(capsule, name) \ - (PyCObject_AsVoidPtr(capsule)) -#endif - -#if PY_MAJOR_VERSION >= 3 -# define PyInt_FromLong PyLong_FromLong -#endif - -#define _cffi_from_c_double PyFloat_FromDouble -#define _cffi_from_c_float PyFloat_FromDouble -#define _cffi_from_c_long PyInt_FromLong -#define _cffi_from_c_ulong PyLong_FromUnsignedLong -#define _cffi_from_c_longlong PyLong_FromLongLong -#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong - -#define _cffi_to_c_double PyFloat_AsDouble -#define _cffi_to_c_float PyFloat_AsDouble - -#define _cffi_from_c_int_const(x) \ - (((x) > 0) ? \ - ((unsigned long long)(x) <= (unsigned long long)LONG_MAX) ? \ - PyInt_FromLong((long)(x)) : \ - PyLong_FromUnsignedLongLong((unsigned long long)(x)) : \ - ((long long)(x) >= (long long)LONG_MIN) ? \ - PyInt_FromLong((long)(x)) : \ - PyLong_FromLongLong((long long)(x))) - -#define _cffi_from_c_int(x, type) \ - (((type)-1) > 0 ? /* unsigned */ \ - (sizeof(type) < sizeof(long) ? PyInt_FromLong(x) : \ - sizeof(type) == sizeof(long) ? PyLong_FromUnsignedLong(x) : \ - PyLong_FromUnsignedLongLong(x)) \ - : (sizeof(type) <= sizeof(long) ? PyInt_FromLong(x) : \ - PyLong_FromLongLong(x))) - -#define _cffi_to_c_int(o, type) \ - (sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \ - : (type)_cffi_to_c_i8(o)) : \ - sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \ - : (type)_cffi_to_c_i16(o)) : \ - sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \ - : (type)_cffi_to_c_i32(o)) : \ - sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \ - : (type)_cffi_to_c_i64(o)) : \ - (Py_FatalError("unsupported size for type " #type), 0)) - -#define _cffi_to_c_i8 \ - ((int(*)(PyObject *))_cffi_exports[1]) -#define _cffi_to_c_u8 \ - ((int(*)(PyObject *))_cffi_exports[2]) -#define _cffi_to_c_i16 \ - ((int(*)(PyObject *))_cffi_exports[3]) -#define _cffi_to_c_u16 \ - ((int(*)(PyObject *))_cffi_exports[4]) -#define _cffi_to_c_i32 \ - ((int(*)(PyObject *))_cffi_exports[5]) -#define _cffi_to_c_u32 \ - ((unsigned int(*)(PyObject *))_cffi_exports[6]) -#define _cffi_to_c_i64 \ - ((long long(*)(PyObject *))_cffi_exports[7]) -#define _cffi_to_c_u64 \ - ((unsigned long long(*)(PyObject *))_cffi_exports[8]) -#define _cffi_to_c_char \ - ((int(*)(PyObject *))_cffi_exports[9]) -#define _cffi_from_c_pointer \ - ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[10]) -#define _cffi_to_c_pointer \ - ((char *(*)(PyObject *, CTypeDescrObject *))_cffi_exports[11]) -#define _cffi_get_struct_layout \ - ((PyObject *(*)(Py_ssize_t[]))_cffi_exports[12]) -#define _cffi_restore_errno \ - ((void(*)(void))_cffi_exports[13]) -#define _cffi_save_errno \ - ((void(*)(void))_cffi_exports[14]) -#define _cffi_from_c_char \ - ((PyObject *(*)(char))_cffi_exports[15]) -#define _cffi_from_c_deref \ - ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[16]) -#define _cffi_to_c \ - ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[17]) -#define _cffi_from_c_struct \ - ((PyObject *(*)(char *, CTypeDescrObject *))_cffi_exports[18]) -#define _cffi_to_c_wchar_t \ - ((wchar_t(*)(PyObject *))_cffi_exports[19]) -#define _cffi_from_c_wchar_t \ - ((PyObject *(*)(wchar_t))_cffi_exports[20]) -#define _cffi_to_c_long_double \ - ((long double(*)(PyObject *))_cffi_exports[21]) -#define _cffi_to_c__Bool \ - ((_Bool(*)(PyObject *))_cffi_exports[22]) -#define _cffi_prepare_pointer_call_argument \ - ((Py_ssize_t(*)(CTypeDescrObject *, PyObject *, char **))_cffi_exports[23]) -#define _cffi_convert_array_from_object \ - ((int(*)(char *, CTypeDescrObject *, PyObject *))_cffi_exports[24]) -#define _CFFI_NUM_EXPORTS 25 - -typedef struct _ctypedescr CTypeDescrObject; - -static void *_cffi_exports[_CFFI_NUM_EXPORTS]; -static PyObject *_cffi_types, *_cffi_VerificationError; - -static int _cffi_setup_custom(PyObject *lib); /* forward */ - -static PyObject *_cffi_setup(PyObject *self, PyObject *args) -{ - PyObject *library; - int was_alive = (_cffi_types != NULL); - if (!PyArg_ParseTuple(args, "OOO", &_cffi_types, &_cffi_VerificationError, - &library)) - return NULL; - Py_INCREF(_cffi_types); - Py_INCREF(_cffi_VerificationError); - if (_cffi_setup_custom(library) < 0) - return NULL; - return PyBool_FromLong(was_alive); -} - -static int _cffi_init(void) -{ - PyObject *module, *c_api_object = NULL; - - module = PyImport_ImportModule("_cffi_backend"); - if (module == NULL) - goto failure; - - c_api_object = PyObject_GetAttrString(module, "_C_API"); - if (c_api_object == NULL) - goto failure; - if (!PyCapsule_CheckExact(c_api_object)) { - PyErr_SetNone(PyExc_ImportError); - goto failure; - } - memcpy(_cffi_exports, PyCapsule_GetPointer(c_api_object, "cffi"), - _CFFI_NUM_EXPORTS * sizeof(void *)); - - Py_DECREF(module); - Py_DECREF(c_api_object); - return 0; - - failure: - Py_XDECREF(module); - Py_XDECREF(c_api_object); - return -1; -} - -#define _cffi_type(num) ((CTypeDescrObject *)PyList_GET_ITEM(_cffi_types, num)) - -/**********/ -''' diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/vengine_gen.py b/Linux_i686/lib/python3.4/site-packages/cffi/vengine_gen.py deleted file mode 100644 index 133ec7f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/vengine_gen.py +++ /dev/null @@ -1,580 +0,0 @@ -import sys, os -import types - -from . import model, ffiplatform - - -class VGenericEngine(object): - _class_key = 'g' - _gen_python_module = False - - def __init__(self, verifier): - self.verifier = verifier - self.ffi = verifier.ffi - self.export_symbols = [] - self._struct_pending_verification = {} - - def patch_extension_kwds(self, kwds): - # add 'export_symbols' to the dictionary. Note that we add the - # list before filling it. When we fill it, it will thus also show - # up in kwds['export_symbols']. - kwds.setdefault('export_symbols', self.export_symbols) - - def find_module(self, module_name, path, so_suffixes): - for so_suffix in so_suffixes: - basename = module_name + so_suffix - if path is None: - path = sys.path - for dirname in path: - filename = os.path.join(dirname, basename) - if os.path.isfile(filename): - return filename - - def collect_types(self): - pass # not needed in the generic engine - - def _prnt(self, what=''): - self._f.write(what + '\n') - - def write_source_to_f(self): - prnt = self._prnt - # first paste some standard set of lines that are mostly '#include' - prnt(cffimod_header) - # then paste the C source given by the user, verbatim. - prnt(self.verifier.preamble) - # - # call generate_gen_xxx_decl(), for every xxx found from - # ffi._parser._declarations. This generates all the functions. - self._generate('decl') - # - # on Windows, distutils insists on putting init_cffi_xyz in - # 'export_symbols', so instead of fighting it, just give up and - # give it one - if sys.platform == 'win32': - if sys.version_info >= (3,): - prefix = 'PyInit_' - else: - prefix = 'init' - modname = self.verifier.get_module_name() - prnt("void %s%s(void) { }\n" % (prefix, modname)) - - def load_library(self): - # import it with the CFFI backend - backend = self.ffi._backend - # needs to make a path that contains '/', on Posix - filename = os.path.join(os.curdir, self.verifier.modulefilename) - module = backend.load_library(filename) - # - # call loading_gen_struct() to get the struct layout inferred by - # the C compiler - self._load(module, 'loading') - - # build the FFILibrary class and instance, this is a module subclass - # because modules are expected to have usually-constant-attributes and - # in PyPy this means the JIT is able to treat attributes as constant, - # which we want. - class FFILibrary(types.ModuleType): - _cffi_generic_module = module - _cffi_ffi = self.ffi - _cffi_dir = [] - def __dir__(self): - return FFILibrary._cffi_dir - library = FFILibrary("") - # - # finally, call the loaded_gen_xxx() functions. This will set - # up the 'library' object. - self._load(module, 'loaded', library=library) - return library - - def _get_declarations(self): - return sorted(self.ffi._parser._declarations.items()) - - def _generate(self, step_name): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - try: - method = getattr(self, '_generate_gen_%s_%s' % (kind, - step_name)) - except AttributeError: - raise ffiplatform.VerificationError( - "not implemented in verify(): %r" % name) - try: - method(tp, realname) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _load(self, module, step_name, **kwds): - for name, tp in self._get_declarations(): - kind, realname = name.split(' ', 1) - method = getattr(self, '_%s_gen_%s' % (step_name, kind)) - try: - method(tp, realname, module, **kwds) - except Exception as e: - model.attach_exception_info(e, name) - raise - - def _generate_nothing(self, tp, name): - pass - - def _loaded_noop(self, tp, name, module, **kwds): - pass - - # ---------- - # typedefs: generates no code so far - - _generate_gen_typedef_decl = _generate_nothing - _loading_gen_typedef = _loaded_noop - _loaded_gen_typedef = _loaded_noop - - # ---------- - # function declarations - - def _generate_gen_function_decl(self, tp, name): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - # cannot support vararg functions better than this: check for its - # exact type (including the fixed arguments), and build it as a - # constant function pointer (no _cffi_f_%s wrapper) - self._generate_gen_const(False, name, tp) - return - prnt = self._prnt - numargs = len(tp.args) - argnames = [] - for i, type in enumerate(tp.args): - indirection = '' - if isinstance(type, model.StructOrUnion): - indirection = '*' - argnames.append('%sx%d' % (indirection, i)) - context = 'argument of %s' % name - arglist = [type.get_c_name(' %s' % arg, context) - for type, arg in zip(tp.args, argnames)] - arglist = ', '.join(arglist) or 'void' - wrappername = '_cffi_f_%s' % name - self.export_symbols.append(wrappername) - funcdecl = ' %s(%s)' % (wrappername, arglist) - context = 'result of %s' % name - prnt(tp.result.get_c_name(funcdecl, context)) - prnt('{') - # - if not isinstance(tp.result, model.VoidType): - result_code = 'return ' - else: - result_code = '' - prnt(' %s%s(%s);' % (result_code, name, ', '.join(argnames))) - prnt('}') - prnt() - - _loading_gen_function = _loaded_noop - - def _loaded_gen_function(self, tp, name, module, library): - assert isinstance(tp, model.FunctionPtrType) - if tp.ellipsis: - newfunction = self._load_constant(False, tp, name, module) - else: - indirections = [] - base_tp = tp - if any(isinstance(typ, model.StructOrUnion) for typ in tp.args): - indirect_args = [] - for i, typ in enumerate(tp.args): - if isinstance(typ, model.StructOrUnion): - typ = model.PointerType(typ) - indirections.append((i, typ)) - indirect_args.append(typ) - tp = model.FunctionPtrType(tuple(indirect_args), - tp.result, tp.ellipsis) - BFunc = self.ffi._get_cached_btype(tp) - wrappername = '_cffi_f_%s' % name - newfunction = module.load_function(BFunc, wrappername) - for i, typ in indirections: - newfunction = self._make_struct_wrapper(newfunction, i, typ, - base_tp) - setattr(library, name, newfunction) - type(library)._cffi_dir.append(name) - - def _make_struct_wrapper(self, oldfunc, i, tp, base_tp): - backend = self.ffi._backend - BType = self.ffi._get_cached_btype(tp) - def newfunc(*args): - args = args[:i] + (backend.newp(BType, args[i]),) + args[i+1:] - return oldfunc(*args) - newfunc._cffi_base_type = base_tp - return newfunc - - # ---------- - # named structs - - def _generate_gen_struct_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'struct', name) - - def _loading_gen_struct(self, tp, name, module): - self._loading_struct_or_union(tp, 'struct', name, module) - - def _loaded_gen_struct(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - def _generate_gen_union_decl(self, tp, name): - assert name == tp.name - self._generate_struct_or_union_decl(tp, 'union', name) - - def _loading_gen_union(self, tp, name, module): - self._loading_struct_or_union(tp, 'union', name, module) - - def _loaded_gen_union(self, tp, name, module, **kwds): - self._loaded_struct_or_union(tp) - - def _generate_struct_or_union_decl(self, tp, prefix, name): - if tp.fldnames is None: - return # nothing to do with opaque structs - checkfuncname = '_cffi_check_%s_%s' % (prefix, name) - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - cname = ('%s %s' % (prefix, name)).strip() - # - prnt = self._prnt - prnt('static void %s(%s *p)' % (checkfuncname, cname)) - prnt('{') - prnt(' /* only to generate compile-time warnings or errors */') - for fname, ftype, fbitsize in tp.enumfields(): - if (isinstance(ftype, model.PrimitiveType) - and ftype.is_integer_type()) or fbitsize >= 0: - # accept all integers, but complain on float or double - prnt(' (void)((p->%s) << 1);' % fname) - else: - # only accept exactly the type declared. - try: - prnt(' { %s = &p->%s; (void)tmp; }' % ( - ftype.get_c_name('*tmp', 'field %r'%fname), fname)) - except ffiplatform.VerificationError as e: - prnt(' /* %s */' % str(e)) # cannot verify it, ignore - prnt('}') - self.export_symbols.append(layoutfuncname) - prnt('intptr_t %s(intptr_t i)' % (layoutfuncname,)) - prnt('{') - prnt(' struct _cffi_aligncheck { char x; %s y; };' % cname) - prnt(' static intptr_t nums[] = {') - prnt(' sizeof(%s),' % cname) - prnt(' offsetof(struct _cffi_aligncheck, y),') - for fname, ftype, fbitsize in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - prnt(' offsetof(%s, %s),' % (cname, fname)) - if isinstance(ftype, model.ArrayType) and ftype.length is None: - prnt(' 0, /* %s */' % ftype._get_c_name()) - else: - prnt(' sizeof(((%s *)0)->%s),' % (cname, fname)) - prnt(' -1') - prnt(' };') - prnt(' return nums[i];') - prnt(' /* the next line is not executed, but compiled */') - prnt(' %s(0);' % (checkfuncname,)) - prnt('}') - prnt() - - def _loading_struct_or_union(self, tp, prefix, name, module): - if tp.fldnames is None: - return # nothing to do with opaque structs - layoutfuncname = '_cffi_layout_%s_%s' % (prefix, name) - # - BFunc = self.ffi._typeof_locked("intptr_t(*)(intptr_t)")[0] - function = module.load_function(BFunc, layoutfuncname) - layout = [] - num = 0 - while True: - x = function(num) - if x < 0: break - layout.append(x) - num += 1 - if isinstance(tp, model.StructOrUnion) and tp.partial: - # use the function()'s sizes and offsets to guide the - # layout of the struct - totalsize = layout[0] - totalalignment = layout[1] - fieldofs = layout[2::2] - fieldsize = layout[3::2] - tp.force_flatten() - assert len(fieldofs) == len(fieldsize) == len(tp.fldnames) - tp.fixedlayout = fieldofs, fieldsize, totalsize, totalalignment - else: - cname = ('%s %s' % (prefix, name)).strip() - self._struct_pending_verification[tp] = layout, cname - - def _loaded_struct_or_union(self, tp): - if tp.fldnames is None: - return # nothing to do with opaque structs - self.ffi._get_cached_btype(tp) # force 'fixedlayout' to be considered - - if tp in self._struct_pending_verification: - # check that the layout sizes and offsets match the real ones - def check(realvalue, expectedvalue, msg): - if realvalue != expectedvalue: - raise ffiplatform.VerificationError( - "%s (we have %d, but C compiler says %d)" - % (msg, expectedvalue, realvalue)) - ffi = self.ffi - BStruct = ffi._get_cached_btype(tp) - layout, cname = self._struct_pending_verification.pop(tp) - check(layout[0], ffi.sizeof(BStruct), "wrong total size") - check(layout[1], ffi.alignof(BStruct), "wrong total alignment") - i = 2 - for fname, ftype, fbitsize in tp.enumfields(): - if fbitsize >= 0: - continue # xxx ignore fbitsize for now - check(layout[i], ffi.offsetof(BStruct, fname), - "wrong offset for field %r" % (fname,)) - if layout[i+1] != 0: - BField = ffi._get_cached_btype(ftype) - check(layout[i+1], ffi.sizeof(BField), - "wrong size for field %r" % (fname,)) - i += 2 - assert i == len(layout) - - # ---------- - # 'anonymous' declarations. These are produced for anonymous structs - # or unions; the 'name' is obtained by a typedef. - - def _generate_gen_anonymous_decl(self, tp, name): - if isinstance(tp, model.EnumType): - self._generate_gen_enum_decl(tp, name, '') - else: - self._generate_struct_or_union_decl(tp, '', name) - - def _loading_gen_anonymous(self, tp, name, module): - if isinstance(tp, model.EnumType): - self._loading_gen_enum(tp, name, module, '') - else: - self._loading_struct_or_union(tp, '', name, module) - - def _loaded_gen_anonymous(self, tp, name, module, **kwds): - if isinstance(tp, model.EnumType): - self._loaded_gen_enum(tp, name, module, **kwds) - else: - self._loaded_struct_or_union(tp) - - # ---------- - # constants, likely declared with '#define' - - def _generate_gen_const(self, is_int, name, tp=None, category='const'): - prnt = self._prnt - funcname = '_cffi_%s_%s' % (category, name) - self.export_symbols.append(funcname) - if is_int: - assert category == 'const' - prnt('int %s(long long *out_value)' % funcname) - prnt('{') - prnt(' *out_value = (long long)(%s);' % (name,)) - prnt(' return (%s) <= 0;' % (name,)) - prnt('}') - else: - assert tp is not None - prnt(tp.get_c_name(' %s(void)' % funcname, name),) - prnt('{') - if category == 'var': - ampersand = '&' - else: - ampersand = '' - prnt(' return (%s%s);' % (ampersand, name)) - prnt('}') - prnt() - - def _generate_gen_constant_decl(self, tp, name): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - self._generate_gen_const(is_int, name, tp) - - _loading_gen_constant = _loaded_noop - - def _load_constant(self, is_int, tp, name, module): - funcname = '_cffi_const_%s' % name - if is_int: - BType = self.ffi._typeof_locked("long long*")[0] - BFunc = self.ffi._typeof_locked("int(*)(long long*)")[0] - function = module.load_function(BFunc, funcname) - p = self.ffi.new(BType) - negative = function(p) - value = int(p[0]) - if value < 0 and not negative: - BLongLong = self.ffi._typeof_locked("long long")[0] - value += (1 << (8*self.ffi.sizeof(BLongLong))) - else: - BFunc = self.ffi._typeof_locked(tp.get_c_name('(*)(void)', name))[0] - function = module.load_function(BFunc, funcname) - value = function() - return value - - def _loaded_gen_constant(self, tp, name, module, library): - is_int = isinstance(tp, model.PrimitiveType) and tp.is_integer_type() - value = self._load_constant(is_int, tp, name, module) - setattr(library, name, value) - type(library)._cffi_dir.append(name) - - # ---------- - # enums - - def _enum_funcname(self, prefix, name): - # "$enum_$1" => "___D_enum____D_1" - name = name.replace('$', '___D_') - return '_cffi_e_%s_%s' % (prefix, name) - - def _generate_gen_enum_decl(self, tp, name, prefix='enum'): - if tp.partial: - for enumerator in tp.enumerators: - self._generate_gen_const(True, enumerator) - return - # - funcname = self._enum_funcname(prefix, name) - self.export_symbols.append(funcname) - prnt = self._prnt - prnt('int %s(char *out_error)' % funcname) - prnt('{') - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - if enumvalue < 0: - prnt(' if ((%s) >= 0 || (long)(%s) != %dL) {' % ( - enumerator, enumerator, enumvalue)) - else: - prnt(' if ((%s) < 0 || (unsigned long)(%s) != %dUL) {' % ( - enumerator, enumerator, enumvalue)) - prnt(' char buf[64];') - prnt(' if ((%s) < 0)' % enumerator) - prnt(' sprintf(buf, "%%ld", (long)(%s));' % enumerator) - prnt(' else') - prnt(' sprintf(buf, "%%lu", (unsigned long)(%s));' % - enumerator) - prnt(' sprintf(out_error,' - ' "%s has the real value %s, not %s",') - prnt(' "%s", buf, "%d");' % ( - enumerator[:100], enumvalue)) - prnt(' return -1;') - prnt(' }') - prnt(' return 0;') - prnt('}') - prnt() - - def _loading_gen_enum(self, tp, name, module, prefix='enum'): - if tp.partial: - enumvalues = [self._load_constant(True, tp, enumerator, module) - for enumerator in tp.enumerators] - tp.enumvalues = tuple(enumvalues) - tp.partial_resolved = True - else: - BType = self.ffi._typeof_locked("char[]")[0] - BFunc = self.ffi._typeof_locked("int(*)(char*)")[0] - funcname = self._enum_funcname(prefix, name) - function = module.load_function(BFunc, funcname) - p = self.ffi.new(BType, 256) - if function(p) < 0: - error = self.ffi.string(p) - if sys.version_info >= (3,): - error = str(error, 'utf-8') - raise ffiplatform.VerificationError(error) - - def _loaded_gen_enum(self, tp, name, module, library): - for enumerator, enumvalue in zip(tp.enumerators, tp.enumvalues): - setattr(library, enumerator, enumvalue) - type(library)._cffi_dir.append(enumerator) - - # ---------- - # macros: for now only for integers - - def _generate_gen_macro_decl(self, tp, name): - assert tp == '...' - self._generate_gen_const(True, name) - - _loading_gen_macro = _loaded_noop - - def _loaded_gen_macro(self, tp, name, module, library): - value = self._load_constant(True, tp, name, module) - setattr(library, name, value) - type(library)._cffi_dir.append(name) - - # ---------- - # global variables - - def _generate_gen_variable_decl(self, tp, name): - if isinstance(tp, model.ArrayType): - if tp.length == '...': - prnt = self._prnt - funcname = '_cffi_sizeof_%s' % (name,) - self.export_symbols.append(funcname) - prnt("size_t %s(void)" % funcname) - prnt("{") - prnt(" return sizeof(%s);" % (name,)) - prnt("}") - tp_ptr = model.PointerType(tp.item) - self._generate_gen_const(False, name, tp_ptr) - else: - tp_ptr = model.PointerType(tp) - self._generate_gen_const(False, name, tp_ptr, category='var') - - _loading_gen_variable = _loaded_noop - - def _loaded_gen_variable(self, tp, name, module, library): - if isinstance(tp, model.ArrayType): # int a[5] is "constant" in the - # sense that "a=..." is forbidden - if tp.length == '...': - funcname = '_cffi_sizeof_%s' % (name,) - BFunc = self.ffi._typeof_locked('size_t(*)(void)')[0] - function = module.load_function(BFunc, funcname) - size = function() - BItemType = self.ffi._get_cached_btype(tp.item) - length, rest = divmod(size, self.ffi.sizeof(BItemType)) - if rest != 0: - raise ffiplatform.VerificationError( - "bad size: %r does not seem to be an array of %s" % - (name, tp.item)) - tp = tp.resolve_length(length) - tp_ptr = model.PointerType(tp.item) - value = self._load_constant(False, tp_ptr, name, module) - # 'value' is a which we have to replace with - # a if the N is actually known - if tp.length is not None: - BArray = self.ffi._get_cached_btype(tp) - value = self.ffi.cast(BArray, value) - setattr(library, name, value) - type(library)._cffi_dir.append(name) - return - # remove ptr= from the library instance, and replace - # it by a property on the class, which reads/writes into ptr[0]. - funcname = '_cffi_var_%s' % name - BFunc = self.ffi._typeof_locked(tp.get_c_name('*(*)(void)', name))[0] - function = module.load_function(BFunc, funcname) - ptr = function() - def getter(library): - return ptr[0] - def setter(library, value): - ptr[0] = value - setattr(type(library), name, property(getter, setter)) - type(library)._cffi_dir.append(name) - -cffimod_header = r''' -#include -#include -#include -#include -#include /* XXX for ssize_t on some platforms */ - -/* this block of #ifs should be kept exactly identical between - c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py */ -#if defined(_MSC_VER) -# include /* for alloca() */ -# if _MSC_VER < 1600 /* MSVC < 2010 */ - typedef __int8 int8_t; - typedef __int16 int16_t; - typedef __int32 int32_t; - typedef __int64 int64_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int64 uint64_t; -# else -# include -# endif -# if _MSC_VER < 1800 /* MSVC < 2013 */ - typedef unsigned char _Bool; -# endif -#else -# include -# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) -# include -# endif -#endif -''' diff --git a/Linux_i686/lib/python3.4/site-packages/cffi/verifier.py b/Linux_i686/lib/python3.4/site-packages/cffi/verifier.py deleted file mode 100644 index 9603a7e..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cffi/verifier.py +++ /dev/null @@ -1,243 +0,0 @@ -import sys, os, binascii, imp, shutil -from . import __version__ -from . import ffiplatform - - -class Verifier(object): - - def __init__(self, ffi, preamble, tmpdir=None, modulename=None, - ext_package=None, tag='', force_generic_engine=False, **kwds): - self.ffi = ffi - self.preamble = preamble - if not modulename: - flattened_kwds = ffiplatform.flatten(kwds) - vengine_class = _locate_engine_class(ffi, force_generic_engine) - self._vengine = vengine_class(self) - self._vengine.patch_extension_kwds(kwds) - self.kwds = kwds - # - if modulename: - if tag: - raise TypeError("can't specify both 'modulename' and 'tag'") - else: - key = '\x00'.join([sys.version[:3], __version__, preamble, - flattened_kwds] + - ffi._cdefsources) - if sys.version_info >= (3,): - key = key.encode('utf-8') - k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) - k1 = k1.lstrip('0x').rstrip('L') - k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) - k2 = k2.lstrip('0').rstrip('L') - modulename = '_cffi_%s_%s%s%s' % (tag, self._vengine._class_key, - k1, k2) - suffix = _get_so_suffixes()[0] - self.tmpdir = tmpdir or _caller_dir_pycache() - self.sourcefilename = os.path.join(self.tmpdir, modulename + '.c') - self.modulefilename = os.path.join(self.tmpdir, modulename + suffix) - self.ext_package = ext_package - self._has_source = False - self._has_module = False - - def write_source(self, file=None): - """Write the C source code. It is produced in 'self.sourcefilename', - which can be tweaked beforehand.""" - with self.ffi._lock: - if self._has_source and file is None: - raise ffiplatform.VerificationError( - "source code already written") - self._write_source(file) - - def compile_module(self): - """Write the C source code (if not done already) and compile it. - This produces a dynamic link library in 'self.modulefilename'.""" - with self.ffi._lock: - if self._has_module: - raise ffiplatform.VerificationError("module already compiled") - if not self._has_source: - self._write_source() - self._compile_module() - - def load_library(self): - """Get a C module from this Verifier instance. - Returns an instance of a FFILibrary class that behaves like the - objects returned by ffi.dlopen(), but that delegates all - operations to the C module. If necessary, the C code is written - and compiled first. - """ - with self.ffi._lock: - if not self._has_module: - self._locate_module() - if not self._has_module: - if not self._has_source: - self._write_source() - self._compile_module() - return self._load_library() - - def get_module_name(self): - basename = os.path.basename(self.modulefilename) - # kill both the .so extension and the other .'s, as introduced - # by Python 3: 'basename.cpython-33m.so' - basename = basename.split('.', 1)[0] - # and the _d added in Python 2 debug builds --- but try to be - # conservative and not kill a legitimate _d - if basename.endswith('_d') and hasattr(sys, 'gettotalrefcount'): - basename = basename[:-2] - return basename - - def get_extension(self): - if not self._has_source: - with self.ffi._lock: - if not self._has_source: - self._write_source() - sourcename = ffiplatform.maybe_relative_path(self.sourcefilename) - modname = self.get_module_name() - return ffiplatform.get_extension(sourcename, modname, **self.kwds) - - def generates_python_module(self): - return self._vengine._gen_python_module - - # ---------- - - def _locate_module(self): - if not os.path.isfile(self.modulefilename): - if self.ext_package: - try: - pkg = __import__(self.ext_package, None, None, ['__doc__']) - except ImportError: - return # cannot import the package itself, give up - # (e.g. it might be called differently before installation) - path = pkg.__path__ - else: - path = None - filename = self._vengine.find_module(self.get_module_name(), path, - _get_so_suffixes()) - if filename is None: - return - self.modulefilename = filename - self._vengine.collect_types() - self._has_module = True - - def _write_source(self, file=None): - must_close = (file is None) - if must_close: - _ensure_dir(self.sourcefilename) - file = open(self.sourcefilename, 'w') - self._vengine._f = file - try: - self._vengine.write_source_to_f() - finally: - del self._vengine._f - if must_close: - file.close() - if must_close: - self._has_source = True - - def _compile_module(self): - # compile this C source - tmpdir = os.path.dirname(self.sourcefilename) - outputfilename = ffiplatform.compile(tmpdir, self.get_extension()) - try: - same = ffiplatform.samefile(outputfilename, self.modulefilename) - except OSError: - same = False - if not same: - _ensure_dir(self.modulefilename) - shutil.move(outputfilename, self.modulefilename) - self._has_module = True - - def _load_library(self): - assert self._has_module - return self._vengine.load_library() - -# ____________________________________________________________ - -_FORCE_GENERIC_ENGINE = False # for tests - -def _locate_engine_class(ffi, force_generic_engine): - if _FORCE_GENERIC_ENGINE: - force_generic_engine = True - if not force_generic_engine: - if '__pypy__' in sys.builtin_module_names: - force_generic_engine = True - else: - try: - import _cffi_backend - except ImportError: - _cffi_backend = '?' - if ffi._backend is not _cffi_backend: - force_generic_engine = True - if force_generic_engine: - from . import vengine_gen - return vengine_gen.VGenericEngine - else: - from . import vengine_cpy - return vengine_cpy.VCPythonEngine - -# ____________________________________________________________ - -_TMPDIR = None - -def _caller_dir_pycache(): - if _TMPDIR: - return _TMPDIR - filename = sys._getframe(2).f_code.co_filename - return os.path.abspath(os.path.join(os.path.dirname(filename), - '__pycache__')) - -def set_tmpdir(dirname): - """Set the temporary directory to use instead of __pycache__.""" - global _TMPDIR - _TMPDIR = dirname - -def cleanup_tmpdir(tmpdir=None, keep_so=False): - """Clean up the temporary directory by removing all files in it - called `_cffi_*.{c,so}` as well as the `build` subdirectory.""" - tmpdir = tmpdir or _caller_dir_pycache() - try: - filelist = os.listdir(tmpdir) - except OSError: - return - if keep_so: - suffix = '.c' # only remove .c files - else: - suffix = _get_so_suffixes()[0].lower() - for fn in filelist: - if fn.lower().startswith('_cffi_') and ( - fn.lower().endswith(suffix) or fn.lower().endswith('.c')): - try: - os.unlink(os.path.join(tmpdir, fn)) - except OSError: - pass - clean_dir = [os.path.join(tmpdir, 'build')] - for dir in clean_dir: - try: - for fn in os.listdir(dir): - fn = os.path.join(dir, fn) - if os.path.isdir(fn): - clean_dir.append(fn) - else: - os.unlink(fn) - except OSError: - pass - -def _get_so_suffixes(): - suffixes = [] - for suffix, mode, type in imp.get_suffixes(): - if type == imp.C_EXTENSION: - suffixes.append(suffix) - - if not suffixes: - # bah, no C_EXTENSION available. Occurs on pypy without cpyext - if sys.platform == 'win32': - suffixes = [".pyd"] - else: - suffixes = [".so"] - - return suffixes - -def _ensure_dir(filename): - try: - os.makedirs(os.path.dirname(filename)) - except OSError: - pass diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/PKG-INFO b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/PKG-INFO deleted file mode 100644 index cd847c1..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/PKG-INFO +++ /dev/null @@ -1,84 +0,0 @@ -Metadata-Version: 1.1 -Name: cryptography -Version: 0.6 -Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers. -Home-page: https://github.com/pyca/cryptography -Author: The cryptography developers -Author-email: cryptography-dev@python.org -License: Apache License, Version 2.0 -Description: Cryptography - ============ - - .. image:: https://pypip.in/version/cryptography/badge.svg - :target: https://pypi.python.org/pypi/cryptography/ - :alt: Latest Version - - .. image:: https://readthedocs.org/projects/cryptography/badge/?version=latest - :target: https://cryptography.io - :alt: Latest Docs - - .. image:: https://travis-ci.org/pyca/cryptography.svg?branch=master - :target: https://travis-ci.org/pyca/cryptography - - .. image:: https://coveralls.io/repos/pyca/cryptography/badge.png?branch=master - :target: https://coveralls.io/r/pyca/cryptography?branch=master - - - ``cryptography`` is a package which provides cryptographic recipes and - primitives to Python developers. Our goal is for it to be your "cryptographic - standard library". It supports Python 2.6-2.7, Python 3.2+, and PyPy. - - ``cryptography`` includes both high level recipes, and low level interfaces to - common cryptographic algorithms such as symmetric ciphers, message digests and - key derivation functions. For example, to encrypt something with - ``cryptography``'s high level symmetric encryption recipe: - - .. code-block:: pycon - - >>> from cryptography.fernet import Fernet - >>> # Put this somewhere safe! - >>> key = Fernet.generate_key() - >>> f = Fernet(key) - >>> token = f.encrypt(b"A really secret message. Not for prying eyes.") - >>> token - '...' - >>> f.decrypt(token) - 'A really secret message. Not for prying eyes.' - - You can find more information in the `documentation`_. - - Discussion - ~~~~~~~~~~ - - If you run into bugs, you can file them in our `issue tracker`_. - - We maintain a `cryptography-dev`_ mailing list for development discussion. - - You can also join ``#cryptography-dev`` on Freenode to ask questions or get - involved. - - - .. _`documentation`: https://cryptography.io/ - .. _`issue tracker`: https://github.com/pyca/cryptography/issues - .. _`cryptography-dev`: https://mail.python.org/mailman/listinfo/cryptography-dev - -Platform: UNKNOWN -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Natural Language :: English -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: POSIX -Classifier: Operating System :: POSIX :: BSD -Classifier: Operating System :: POSIX :: Linux -Classifier: Operating System :: Microsoft :: Windows -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Security :: Cryptography diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/SOURCES.txt b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/SOURCES.txt deleted file mode 100644 index 30256ee..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/SOURCES.txt +++ /dev/null @@ -1,217 +0,0 @@ -AUTHORS.rst -CHANGELOG.rst -CONTRIBUTING.rst -LICENSE -MANIFEST.in -README.rst -setup.cfg -setup.py -cryptography/__about__.py -cryptography/__init__.py -cryptography/exceptions.py -cryptography/fernet.py -cryptography/utils.py -cryptography.egg-info/PKG-INFO -cryptography.egg-info/SOURCES.txt -cryptography.egg-info/dependency_links.txt -cryptography.egg-info/entry_points.txt -cryptography.egg-info/not-zip-safe -cryptography.egg-info/requires.txt -cryptography.egg-info/top_level.txt -cryptography/hazmat/__init__.py -cryptography/hazmat/backends/__init__.py -cryptography/hazmat/backends/interfaces.py -cryptography/hazmat/backends/multibackend.py -cryptography/hazmat/backends/commoncrypto/__init__.py -cryptography/hazmat/backends/commoncrypto/backend.py -cryptography/hazmat/backends/commoncrypto/ciphers.py -cryptography/hazmat/backends/commoncrypto/hashes.py -cryptography/hazmat/backends/commoncrypto/hmac.py -cryptography/hazmat/backends/openssl/__init__.py -cryptography/hazmat/backends/openssl/backend.py -cryptography/hazmat/backends/openssl/ciphers.py -cryptography/hazmat/backends/openssl/cmac.py -cryptography/hazmat/backends/openssl/dsa.py -cryptography/hazmat/backends/openssl/ec.py -cryptography/hazmat/backends/openssl/hashes.py -cryptography/hazmat/backends/openssl/hmac.py -cryptography/hazmat/backends/openssl/rsa.py -cryptography/hazmat/bindings/__init__.py -cryptography/hazmat/bindings/utils.py -cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_3e31f141x4000d087.c -cryptography/hazmat/bindings/commoncrypto/__init__.py -cryptography/hazmat/bindings/commoncrypto/binding.py -cryptography/hazmat/bindings/commoncrypto/cf.py -cryptography/hazmat/bindings/commoncrypto/common_cryptor.py -cryptography/hazmat/bindings/commoncrypto/common_digest.py -cryptography/hazmat/bindings/commoncrypto/common_hmac.py -cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py -cryptography/hazmat/bindings/commoncrypto/secimport.py -cryptography/hazmat/bindings/commoncrypto/secitem.py -cryptography/hazmat/bindings/commoncrypto/seckey.py -cryptography/hazmat/bindings/commoncrypto/seckeychain.py -cryptography/hazmat/bindings/commoncrypto/sectransform.py -cryptography/hazmat/bindings/openssl/__init__.py -cryptography/hazmat/bindings/openssl/aes.py -cryptography/hazmat/bindings/openssl/asn1.py -cryptography/hazmat/bindings/openssl/bignum.py -cryptography/hazmat/bindings/openssl/binding.py -cryptography/hazmat/bindings/openssl/bio.py -cryptography/hazmat/bindings/openssl/cmac.py -cryptography/hazmat/bindings/openssl/cms.py -cryptography/hazmat/bindings/openssl/conf.py -cryptography/hazmat/bindings/openssl/crypto.py -cryptography/hazmat/bindings/openssl/dh.py -cryptography/hazmat/bindings/openssl/dsa.py -cryptography/hazmat/bindings/openssl/ec.py -cryptography/hazmat/bindings/openssl/ecdh.py -cryptography/hazmat/bindings/openssl/ecdsa.py -cryptography/hazmat/bindings/openssl/engine.py -cryptography/hazmat/bindings/openssl/err.py -cryptography/hazmat/bindings/openssl/evp.py -cryptography/hazmat/bindings/openssl/hmac.py -cryptography/hazmat/bindings/openssl/nid.py -cryptography/hazmat/bindings/openssl/objects.py -cryptography/hazmat/bindings/openssl/opensslv.py -cryptography/hazmat/bindings/openssl/osrandom_engine.py -cryptography/hazmat/bindings/openssl/pem.py -cryptography/hazmat/bindings/openssl/pkcs12.py -cryptography/hazmat/bindings/openssl/pkcs7.py -cryptography/hazmat/bindings/openssl/rand.py -cryptography/hazmat/bindings/openssl/rsa.py -cryptography/hazmat/bindings/openssl/ssl.py -cryptography/hazmat/bindings/openssl/x509.py -cryptography/hazmat/bindings/openssl/x509_vfy.py -cryptography/hazmat/bindings/openssl/x509name.py -cryptography/hazmat/bindings/openssl/x509v3.py -cryptography/hazmat/primitives/__init__.py -cryptography/hazmat/primitives/cmac.py -cryptography/hazmat/primitives/constant_time.py -cryptography/hazmat/primitives/hashes.py -cryptography/hazmat/primitives/hmac.py -cryptography/hazmat/primitives/interfaces.py -cryptography/hazmat/primitives/padding.py -cryptography/hazmat/primitives/serialization.py -cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_7ab3712bx4f158fee.c -cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_dd416c1exc1767c5a.c -cryptography/hazmat/primitives/asymmetric/__init__.py -cryptography/hazmat/primitives/asymmetric/dsa.py -cryptography/hazmat/primitives/asymmetric/ec.py -cryptography/hazmat/primitives/asymmetric/padding.py -cryptography/hazmat/primitives/asymmetric/rsa.py -cryptography/hazmat/primitives/ciphers/__init__.py -cryptography/hazmat/primitives/ciphers/algorithms.py -cryptography/hazmat/primitives/ciphers/base.py -cryptography/hazmat/primitives/ciphers/modes.py -cryptography/hazmat/primitives/kdf/__init__.py -cryptography/hazmat/primitives/kdf/hkdf.py -cryptography/hazmat/primitives/kdf/pbkdf2.py -cryptography/hazmat/primitives/src/constant_time.c -cryptography/hazmat/primitives/src/constant_time.h -cryptography/hazmat/primitives/twofactor/__init__.py -cryptography/hazmat/primitives/twofactor/hotp.py -cryptography/hazmat/primitives/twofactor/totp.py -docs/Makefile -docs/api-stability.rst -docs/changelog.rst -docs/community.rst -docs/conf.py -docs/cryptography-docs.py -docs/doing-a-release.rst -docs/exceptions.rst -docs/faq.rst -docs/fernet.rst -docs/glossary.rst -docs/index.rst -docs/installation.rst -docs/limitations.rst -docs/make.bat -docs/random-numbers.rst -docs/security.rst -docs/spelling_wordlist.txt -docs/_static/.keep -docs/development/c-bindings.rst -docs/development/getting-started.rst -docs/development/index.rst -docs/development/reviewing-patches.rst -docs/development/submitting-patches.rst -docs/development/test-vectors.rst -docs/development/custom-vectors/cast5.rst -docs/development/custom-vectors/idea.rst -docs/development/custom-vectors/seed.rst -docs/development/custom-vectors/cast5/generate_cast5.py -docs/development/custom-vectors/cast5/verify_cast5.go -docs/development/custom-vectors/idea/generate_idea.py -docs/development/custom-vectors/idea/verify_idea.py -docs/development/custom-vectors/seed/generate_seed.py -docs/development/custom-vectors/seed/verify_seed.py -docs/hazmat/backends/commoncrypto.rst -docs/hazmat/backends/index.rst -docs/hazmat/backends/interfaces.rst -docs/hazmat/backends/multibackend.rst -docs/hazmat/backends/openssl.rst -docs/hazmat/bindings/commoncrypto.rst -docs/hazmat/bindings/index.rst -docs/hazmat/bindings/openssl.rst -docs/hazmat/primitives/constant-time.rst -docs/hazmat/primitives/cryptographic-hashes.rst -docs/hazmat/primitives/index.rst -docs/hazmat/primitives/interfaces.rst -docs/hazmat/primitives/key-derivation-functions.rst -docs/hazmat/primitives/padding.rst -docs/hazmat/primitives/symmetric-encryption.rst -docs/hazmat/primitives/twofactor.rst -docs/hazmat/primitives/asymmetric/dsa.rst -docs/hazmat/primitives/asymmetric/ec.rst -docs/hazmat/primitives/asymmetric/index.rst -docs/hazmat/primitives/asymmetric/padding.rst -docs/hazmat/primitives/asymmetric/rsa.rst -docs/hazmat/primitives/asymmetric/serialization.rst -docs/hazmat/primitives/mac/cmac.rst -docs/hazmat/primitives/mac/hmac.rst -docs/hazmat/primitives/mac/index.rst -tests/__init__.py -tests/conftest.py -tests/test_fernet.py -tests/test_utils.py -tests/utils.py -tests/hazmat/__init__.py -tests/hazmat/backends/__init__.py -tests/hazmat/backends/test_commoncrypto.py -tests/hazmat/backends/test_multibackend.py -tests/hazmat/backends/test_openssl.py -tests/hazmat/bindings/test_commoncrypto.py -tests/hazmat/bindings/test_openssl.py -tests/hazmat/bindings/test_utils.py -tests/hazmat/primitives/__init__.py -tests/hazmat/primitives/fixtures_dsa.py -tests/hazmat/primitives/fixtures_rsa.py -tests/hazmat/primitives/test_3des.py -tests/hazmat/primitives/test_aes.py -tests/hazmat/primitives/test_arc4.py -tests/hazmat/primitives/test_block.py -tests/hazmat/primitives/test_blowfish.py -tests/hazmat/primitives/test_camellia.py -tests/hazmat/primitives/test_cast5.py -tests/hazmat/primitives/test_ciphers.py -tests/hazmat/primitives/test_cmac.py -tests/hazmat/primitives/test_constant_time.py -tests/hazmat/primitives/test_dsa.py -tests/hazmat/primitives/test_ec.py -tests/hazmat/primitives/test_hash_vectors.py -tests/hazmat/primitives/test_hashes.py -tests/hazmat/primitives/test_hkdf.py -tests/hazmat/primitives/test_hkdf_vectors.py -tests/hazmat/primitives/test_hmac.py -tests/hazmat/primitives/test_hmac_vectors.py -tests/hazmat/primitives/test_idea.py -tests/hazmat/primitives/test_padding.py -tests/hazmat/primitives/test_pbkdf2hmac.py -tests/hazmat/primitives/test_pbkdf2hmac_vectors.py -tests/hazmat/primitives/test_rsa.py -tests/hazmat/primitives/test_seed.py -tests/hazmat/primitives/test_serialization.py -tests/hazmat/primitives/utils.py -tests/hazmat/primitives/twofactor/__init__.py -tests/hazmat/primitives/twofactor/test_hotp.py -tests/hazmat/primitives/twofactor/test_totp.py \ No newline at end of file diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/entry_points.txt b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/entry_points.txt deleted file mode 100644 index bfde650..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[cryptography.backends] -openssl = cryptography.hazmat.backends.openssl:backend - diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/installed-files.txt deleted file mode 100644 index 2528266..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/installed-files.txt +++ /dev/null @@ -1,202 +0,0 @@ -../cryptography/utils.py -../cryptography/__about__.py -../cryptography/__init__.py -../cryptography/exceptions.py -../cryptography/fernet.py -../cryptography/hazmat/__init__.py -../cryptography/hazmat/bindings/utils.py -../cryptography/hazmat/bindings/__init__.py -../cryptography/hazmat/primitives/interfaces.py -../cryptography/hazmat/primitives/constant_time.py -../cryptography/hazmat/primitives/__init__.py -../cryptography/hazmat/primitives/hashes.py -../cryptography/hazmat/primitives/hmac.py -../cryptography/hazmat/primitives/padding.py -../cryptography/hazmat/primitives/serialization.py -../cryptography/hazmat/primitives/cmac.py -../cryptography/hazmat/backends/interfaces.py -../cryptography/hazmat/backends/multibackend.py -../cryptography/hazmat/backends/__init__.py -../cryptography/hazmat/bindings/commoncrypto/secimport.py -../cryptography/hazmat/bindings/commoncrypto/common_cryptor.py -../cryptography/hazmat/bindings/commoncrypto/seckeychain.py -../cryptography/hazmat/bindings/commoncrypto/common_hmac.py -../cryptography/hazmat/bindings/commoncrypto/__init__.py -../cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py -../cryptography/hazmat/bindings/commoncrypto/sectransform.py -../cryptography/hazmat/bindings/commoncrypto/binding.py -../cryptography/hazmat/bindings/commoncrypto/common_digest.py -../cryptography/hazmat/bindings/commoncrypto/seckey.py -../cryptography/hazmat/bindings/commoncrypto/secitem.py -../cryptography/hazmat/bindings/commoncrypto/cf.py -../cryptography/hazmat/bindings/openssl/opensslv.py -../cryptography/hazmat/bindings/openssl/ec.py -../cryptography/hazmat/bindings/openssl/x509_vfy.py -../cryptography/hazmat/bindings/openssl/aes.py -../cryptography/hazmat/bindings/openssl/asn1.py -../cryptography/hazmat/bindings/openssl/objects.py -../cryptography/hazmat/bindings/openssl/dsa.py -../cryptography/hazmat/bindings/openssl/x509name.py -../cryptography/hazmat/bindings/openssl/osrandom_engine.py -../cryptography/hazmat/bindings/openssl/rand.py -../cryptography/hazmat/bindings/openssl/cms.py -../cryptography/hazmat/bindings/openssl/engine.py -../cryptography/hazmat/bindings/openssl/__init__.py -../cryptography/hazmat/bindings/openssl/ssl.py -../cryptography/hazmat/bindings/openssl/nid.py -../cryptography/hazmat/bindings/openssl/x509v3.py -../cryptography/hazmat/bindings/openssl/err.py -../cryptography/hazmat/bindings/openssl/bio.py -../cryptography/hazmat/bindings/openssl/ecdsa.py -../cryptography/hazmat/bindings/openssl/pkcs7.py -../cryptography/hazmat/bindings/openssl/bignum.py -../cryptography/hazmat/bindings/openssl/binding.py -../cryptography/hazmat/bindings/openssl/pem.py -../cryptography/hazmat/bindings/openssl/rsa.py -../cryptography/hazmat/bindings/openssl/hmac.py -../cryptography/hazmat/bindings/openssl/conf.py -../cryptography/hazmat/bindings/openssl/dh.py -../cryptography/hazmat/bindings/openssl/x509.py -../cryptography/hazmat/bindings/openssl/ecdh.py -../cryptography/hazmat/bindings/openssl/evp.py -../cryptography/hazmat/bindings/openssl/cmac.py -../cryptography/hazmat/bindings/openssl/crypto.py -../cryptography/hazmat/bindings/openssl/pkcs12.py -../cryptography/hazmat/primitives/kdf/__init__.py -../cryptography/hazmat/primitives/kdf/hkdf.py -../cryptography/hazmat/primitives/kdf/pbkdf2.py -../cryptography/hazmat/primitives/asymmetric/ec.py -../cryptography/hazmat/primitives/asymmetric/dsa.py -../cryptography/hazmat/primitives/asymmetric/__init__.py -../cryptography/hazmat/primitives/asymmetric/rsa.py -../cryptography/hazmat/primitives/asymmetric/padding.py -../cryptography/hazmat/primitives/ciphers/base.py -../cryptography/hazmat/primitives/ciphers/__init__.py -../cryptography/hazmat/primitives/ciphers/modes.py -../cryptography/hazmat/primitives/ciphers/algorithms.py -../cryptography/hazmat/primitives/twofactor/__init__.py -../cryptography/hazmat/primitives/twofactor/totp.py -../cryptography/hazmat/primitives/twofactor/hotp.py -../cryptography/hazmat/backends/commoncrypto/backend.py -../cryptography/hazmat/backends/commoncrypto/__init__.py -../cryptography/hazmat/backends/commoncrypto/hashes.py -../cryptography/hazmat/backends/commoncrypto/hmac.py -../cryptography/hazmat/backends/commoncrypto/ciphers.py -../cryptography/hazmat/backends/openssl/ec.py -../cryptography/hazmat/backends/openssl/dsa.py -../cryptography/hazmat/backends/openssl/backend.py -../cryptography/hazmat/backends/openssl/__init__.py -../cryptography/hazmat/backends/openssl/hashes.py -../cryptography/hazmat/backends/openssl/rsa.py -../cryptography/hazmat/backends/openssl/hmac.py -../cryptography/hazmat/backends/openssl/cmac.py -../cryptography/hazmat/backends/openssl/ciphers.py -../cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_3e31f141x4000d087.c -../cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_7ab3712bx4f158fee.c -../cryptography/hazmat/primitives/__pycache__/_Cryptography_cffi_dd416c1exc1767c5a.c -../cryptography/hazmat/primitives/src/constant_time.c -../cryptography/hazmat/primitives/src/constant_time.h -../cryptography/__pycache__/utils.cpython-34.pyc -../cryptography/__pycache__/__about__.cpython-34.pyc -../cryptography/__pycache__/__init__.cpython-34.pyc -../cryptography/__pycache__/exceptions.cpython-34.pyc -../cryptography/__pycache__/fernet.cpython-34.pyc -../cryptography/hazmat/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/bindings/__pycache__/utils.cpython-34.pyc -../cryptography/hazmat/bindings/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/interfaces.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/constant_time.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/hashes.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/hmac.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/padding.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/serialization.cpython-34.pyc -../cryptography/hazmat/primitives/__pycache__/cmac.cpython-34.pyc -../cryptography/hazmat/backends/__pycache__/interfaces.cpython-34.pyc -../cryptography/hazmat/backends/__pycache__/multibackend.cpython-34.pyc -../cryptography/hazmat/backends/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/secimport.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_cryptor.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/seckeychain.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_hmac.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_key_derivation.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/sectransform.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/binding.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/common_digest.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/seckey.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/secitem.cpython-34.pyc -../cryptography/hazmat/bindings/commoncrypto/__pycache__/cf.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/opensslv.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/ec.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/x509_vfy.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/aes.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/asn1.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/objects.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/dsa.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/x509name.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/osrandom_engine.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/rand.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/cms.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/engine.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/ssl.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/nid.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/x509v3.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/err.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/bio.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/ecdsa.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/pkcs7.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/bignum.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/binding.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/pem.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/rsa.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/hmac.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/conf.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/dh.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/x509.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/ecdh.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/evp.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/cmac.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/crypto.cpython-34.pyc -../cryptography/hazmat/bindings/openssl/__pycache__/pkcs12.cpython-34.pyc -../cryptography/hazmat/primitives/kdf/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/primitives/kdf/__pycache__/hkdf.cpython-34.pyc -../cryptography/hazmat/primitives/kdf/__pycache__/pbkdf2.cpython-34.pyc -../cryptography/hazmat/primitives/asymmetric/__pycache__/ec.cpython-34.pyc -../cryptography/hazmat/primitives/asymmetric/__pycache__/dsa.cpython-34.pyc -../cryptography/hazmat/primitives/asymmetric/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/primitives/asymmetric/__pycache__/rsa.cpython-34.pyc -../cryptography/hazmat/primitives/asymmetric/__pycache__/padding.cpython-34.pyc -../cryptography/hazmat/primitives/ciphers/__pycache__/base.cpython-34.pyc -../cryptography/hazmat/primitives/ciphers/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/primitives/ciphers/__pycache__/modes.cpython-34.pyc -../cryptography/hazmat/primitives/ciphers/__pycache__/algorithms.cpython-34.pyc -../cryptography/hazmat/primitives/twofactor/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/primitives/twofactor/__pycache__/totp.cpython-34.pyc -../cryptography/hazmat/primitives/twofactor/__pycache__/hotp.cpython-34.pyc -../cryptography/hazmat/backends/commoncrypto/__pycache__/backend.cpython-34.pyc -../cryptography/hazmat/backends/commoncrypto/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/backends/commoncrypto/__pycache__/hashes.cpython-34.pyc -../cryptography/hazmat/backends/commoncrypto/__pycache__/hmac.cpython-34.pyc -../cryptography/hazmat/backends/commoncrypto/__pycache__/ciphers.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/ec.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/dsa.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/backend.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/__init__.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/hashes.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/rsa.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/hmac.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/cmac.cpython-34.pyc -../cryptography/hazmat/backends/openssl/__pycache__/ciphers.cpython-34.pyc -../cryptography/_Cryptography_cffi_3e31f141x4000d087.cpython-34m.so -../cryptography/_Cryptography_cffi_7ab3712bx4f158fee.cpython-34m.so -../cryptography/_Cryptography_cffi_dd416c1exc1767c5a.cpython-34m.so -./ -dependency_links.txt -entry_points.txt -PKG-INFO -SOURCES.txt -not-zip-safe -top_level.txt -requires.txt diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/not-zip-safe b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/not-zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/requires.txt b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/requires.txt deleted file mode 100644 index fc0ac73..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -cffi>=0.8 -six>=1.4.1 -setuptools diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/top_level.txt deleted file mode 100644 index 60d9fd4..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography-0.6.egg-info/top_level.txt +++ /dev/null @@ -1,4 +0,0 @@ -_Cryptography_cffi_7ab3712bx4f158fee -_Cryptography_cffi_3e31f141x4000d087 -cryptography -_Cryptography_cffi_dd416c1exc1767c5a diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_3e31f141x4000d087.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_3e31f141x4000d087.cpython-34m.so deleted file mode 100755 index 6cafef496344c636de8762c7f72464e851b38a55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1670660 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%0AKK54n{8O#!Ml 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 z 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ç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ആ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%0Da?oKVk+}&Z|9ut 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%0Ad4GTeI9+t|@aXLgC<& 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

(rN;k>ggfNef%`WV%n1%Ax_atJ9b+c2vz)-I)H% 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 )RIxvQo>Gn^5OVl0t+YpF4Y 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 diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_7ab3712bx4f158fee.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/cryptography/_Cryptography_cffi_7ab3712bx4f158fee.cpython-34m.so deleted file mode 100755 index 143763a088729bb29cf1d9e90596a95c9ba873ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25900 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 diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/__about__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/__about__.py deleted file mode 100644 index 65c28fb..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/__about__.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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. -from __future__ import absolute_import, division, print_function - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] - -__title__ = "cryptography" -__summary__ = ("cryptography is a package which provides cryptographic recipes" - " and primitives to Python developers.") -__uri__ = "https://github.com/pyca/cryptography" - -__version__ = "0.6" - -__author__ = "The cryptography developers" -__email__ = "cryptography-dev@python.org" - -__license__ = "Apache License, Version 2.0" -__copyright__ = "Copyright 2013-2014 {0}".format(__author__) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/__init__.py deleted file mode 100644 index f27ba85..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography.__about__ import ( - __author__, __copyright__, __email__, __license__, __summary__, __title__, - __uri__, __version__ -) - - -__all__ = [ - "__title__", "__summary__", "__uri__", "__version__", "__author__", - "__email__", "__license__", "__copyright__", -] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/exceptions.py b/Linux_i686/lib/python3.4/site-packages/cryptography/exceptions.py deleted file mode 100644 index c14763f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/exceptions.py +++ /dev/null @@ -1,63 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - - -class _Reasons(object): - BACKEND_MISSING_INTERFACE = object() - UNSUPPORTED_HASH = object() - UNSUPPORTED_CIPHER = object() - UNSUPPORTED_PADDING = object() - UNSUPPORTED_MGF = object() - UNSUPPORTED_PUBLIC_KEY_ALGORITHM = object() - UNSUPPORTED_ELLIPTIC_CURVE = object() - UNSUPPORTED_SERIALIZATION = object() - - -class UnsupportedAlgorithm(Exception): - def __init__(self, message, reason=None): - super(UnsupportedAlgorithm, self).__init__(message) - self._reason = reason - - -class AlreadyFinalized(Exception): - pass - - -class AlreadyUpdated(Exception): - pass - - -class NotYetFinalized(Exception): - pass - - -class InvalidTag(Exception): - pass - - -class InvalidSignature(Exception): - pass - - -class InternalError(Exception): - pass - - -class InvalidKey(Exception): - pass - - -class InvalidToken(Exception): - pass diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/fernet.py b/Linux_i686/lib/python3.4/site-packages/cryptography/fernet.py deleted file mode 100644 index cdb9bdc..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/fernet.py +++ /dev/null @@ -1,129 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import base64 -import binascii -import os -import struct -import time - -import six - -from cryptography.exceptions import InvalidSignature -from cryptography.hazmat.backends import default_backend -from cryptography.hazmat.primitives import hashes, padding -from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes -from cryptography.hazmat.primitives.hmac import HMAC - - -class InvalidToken(Exception): - pass - - -_MAX_CLOCK_SKEW = 60 - - -class Fernet(object): - def __init__(self, key, backend=None): - if backend is None: - backend = default_backend() - - key = base64.urlsafe_b64decode(key) - if len(key) != 32: - raise ValueError( - "Fernet key must be 32 url-safe base64-encoded bytes." - ) - - self._signing_key = key[:16] - self._encryption_key = key[16:] - self._backend = backend - - @classmethod - def generate_key(cls): - return base64.urlsafe_b64encode(os.urandom(32)) - - def encrypt(self, data): - current_time = int(time.time()) - iv = os.urandom(16) - return self._encrypt_from_parts(data, current_time, iv) - - def _encrypt_from_parts(self, data, current_time, iv): - if not isinstance(data, bytes): - raise TypeError("data must be bytes.") - - padder = padding.PKCS7(algorithms.AES.block_size).padder() - padded_data = padder.update(data) + padder.finalize() - encryptor = Cipher( - algorithms.AES(self._encryption_key), modes.CBC(iv), self._backend - ).encryptor() - ciphertext = encryptor.update(padded_data) + encryptor.finalize() - - basic_parts = ( - b"\x80" + struct.pack(">Q", current_time) + iv + ciphertext - ) - - h = HMAC(self._signing_key, hashes.SHA256(), backend=self._backend) - h.update(basic_parts) - hmac = h.finalize() - return base64.urlsafe_b64encode(basic_parts + hmac) - - def decrypt(self, token, ttl=None): - if not isinstance(token, bytes): - raise TypeError("token must be bytes.") - - current_time = int(time.time()) - - try: - data = base64.urlsafe_b64decode(token) - except (TypeError, binascii.Error): - raise InvalidToken - - if six.indexbytes(data, 0) != 0x80: - raise InvalidToken - - try: - timestamp, = struct.unpack(">Q", data[1:9]) - except struct.error: - raise InvalidToken - if ttl is not None: - if timestamp + ttl < current_time: - raise InvalidToken - if current_time + _MAX_CLOCK_SKEW < timestamp: - raise InvalidToken - h = HMAC(self._signing_key, hashes.SHA256(), backend=self._backend) - h.update(data[:-32]) - try: - h.verify(data[-32:]) - except InvalidSignature: - raise InvalidToken - - iv = data[9:25] - ciphertext = data[25:-32] - decryptor = Cipher( - algorithms.AES(self._encryption_key), modes.CBC(iv), self._backend - ).decryptor() - plaintext_padded = decryptor.update(ciphertext) - try: - plaintext_padded += decryptor.finalize() - except ValueError: - raise InvalidToken - unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder() - - unpadded = unpadder.update(plaintext_padded) - try: - unpadded += unpadder.finalize() - except ValueError: - raise InvalidToken - return unpadded diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/__init__.py deleted file mode 100644 index b0f663f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import pkg_resources - -from cryptography.hazmat.backends.multibackend import MultiBackend - - -_available_backends_list = None - - -def _available_backends(): - global _available_backends_list - - if _available_backends_list is None: - _available_backends_list = [ - backend.load(require=False) - for backend in pkg_resources.iter_entry_points( - "cryptography.backends" - ) - ] - - return _available_backends_list - -_default_backend = None - - -def default_backend(): - global _default_backend - - if _default_backend is None: - _default_backend = MultiBackend(_available_backends()) - - return _default_backend diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/__init__.py deleted file mode 100644 index f080394..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography.hazmat.backends.commoncrypto.backend import backend - - -__all__ = ["backend"] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/backend.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/backend.py deleted file mode 100644 index 7bab979..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/backend.py +++ /dev/null @@ -1,253 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from collections import namedtuple - -from cryptography import utils -from cryptography.exceptions import InternalError -from cryptography.hazmat.backends.commoncrypto.ciphers import ( - _CipherContext, _GCMCipherContext -) -from cryptography.hazmat.backends.commoncrypto.hashes import _HashContext -from cryptography.hazmat.backends.commoncrypto.hmac import _HMACContext -from cryptography.hazmat.backends.interfaces import ( - CipherBackend, HMACBackend, HashBackend, PBKDF2HMACBackend -) -from cryptography.hazmat.bindings.commoncrypto.binding import Binding -from cryptography.hazmat.primitives.ciphers.algorithms import ( - AES, ARC4, Blowfish, CAST5, TripleDES -) -from cryptography.hazmat.primitives.ciphers.modes import ( - CBC, CFB, CFB8, CTR, ECB, GCM, OFB -) - - -HashMethods = namedtuple( - "HashMethods", ["ctx", "hash_init", "hash_update", "hash_final"] -) - - -@utils.register_interface(CipherBackend) -@utils.register_interface(HashBackend) -@utils.register_interface(HMACBackend) -@utils.register_interface(PBKDF2HMACBackend) -class Backend(object): - """ - CommonCrypto API wrapper. - """ - name = "commoncrypto" - - def __init__(self): - self._binding = Binding() - self._ffi = self._binding.ffi - self._lib = self._binding.lib - - self._cipher_registry = {} - self._register_default_ciphers() - self._hash_mapping = { - "md5": HashMethods( - "CC_MD5_CTX *", self._lib.CC_MD5_Init, - self._lib.CC_MD5_Update, self._lib.CC_MD5_Final - ), - "sha1": HashMethods( - "CC_SHA1_CTX *", self._lib.CC_SHA1_Init, - self._lib.CC_SHA1_Update, self._lib.CC_SHA1_Final - ), - "sha224": HashMethods( - "CC_SHA256_CTX *", self._lib.CC_SHA224_Init, - self._lib.CC_SHA224_Update, self._lib.CC_SHA224_Final - ), - "sha256": HashMethods( - "CC_SHA256_CTX *", self._lib.CC_SHA256_Init, - self._lib.CC_SHA256_Update, self._lib.CC_SHA256_Final - ), - "sha384": HashMethods( - "CC_SHA512_CTX *", self._lib.CC_SHA384_Init, - self._lib.CC_SHA384_Update, self._lib.CC_SHA384_Final - ), - "sha512": HashMethods( - "CC_SHA512_CTX *", self._lib.CC_SHA512_Init, - self._lib.CC_SHA512_Update, self._lib.CC_SHA512_Final - ), - } - - self._supported_hmac_algorithms = { - "md5": self._lib.kCCHmacAlgMD5, - "sha1": self._lib.kCCHmacAlgSHA1, - "sha224": self._lib.kCCHmacAlgSHA224, - "sha256": self._lib.kCCHmacAlgSHA256, - "sha384": self._lib.kCCHmacAlgSHA384, - "sha512": self._lib.kCCHmacAlgSHA512, - } - - self._supported_pbkdf2_hmac_algorithms = { - "sha1": self._lib.kCCPRFHmacAlgSHA1, - "sha224": self._lib.kCCPRFHmacAlgSHA224, - "sha256": self._lib.kCCPRFHmacAlgSHA256, - "sha384": self._lib.kCCPRFHmacAlgSHA384, - "sha512": self._lib.kCCPRFHmacAlgSHA512, - } - - def hash_supported(self, algorithm): - return algorithm.name in self._hash_mapping - - def hmac_supported(self, algorithm): - return algorithm.name in self._supported_hmac_algorithms - - def create_hash_ctx(self, algorithm): - return _HashContext(self, algorithm) - - def create_hmac_ctx(self, key, algorithm): - return _HMACContext(self, key, algorithm) - - def cipher_supported(self, cipher, mode): - return (type(cipher), type(mode)) in self._cipher_registry - - def create_symmetric_encryption_ctx(self, cipher, mode): - if isinstance(mode, GCM): - return _GCMCipherContext( - self, cipher, mode, self._lib.kCCEncrypt - ) - else: - return _CipherContext(self, cipher, mode, self._lib.kCCEncrypt) - - def create_symmetric_decryption_ctx(self, cipher, mode): - if isinstance(mode, GCM): - return _GCMCipherContext( - self, cipher, mode, self._lib.kCCDecrypt - ) - else: - return _CipherContext(self, cipher, mode, self._lib.kCCDecrypt) - - def pbkdf2_hmac_supported(self, algorithm): - return algorithm.name in self._supported_pbkdf2_hmac_algorithms - - def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations, - key_material): - alg_enum = self._supported_pbkdf2_hmac_algorithms[algorithm.name] - buf = self._ffi.new("char[]", length) - res = self._lib.CCKeyDerivationPBKDF( - self._lib.kCCPBKDF2, - key_material, - len(key_material), - salt, - len(salt), - alg_enum, - iterations, - buf, - length - ) - self._check_cipher_response(res) - - return self._ffi.buffer(buf)[:] - - def _register_cipher_adapter(self, cipher_cls, cipher_const, mode_cls, - mode_const): - if (cipher_cls, mode_cls) in self._cipher_registry: - raise ValueError("Duplicate registration for: {0} {1}.".format( - cipher_cls, mode_cls) - ) - self._cipher_registry[cipher_cls, mode_cls] = (cipher_const, - mode_const) - - def _register_default_ciphers(self): - for mode_cls, mode_const in [ - (CBC, self._lib.kCCModeCBC), - (ECB, self._lib.kCCModeECB), - (CFB, self._lib.kCCModeCFB), - (CFB8, self._lib.kCCModeCFB8), - (OFB, self._lib.kCCModeOFB), - (CTR, self._lib.kCCModeCTR), - (GCM, self._lib.kCCModeGCM), - ]: - self._register_cipher_adapter( - AES, - self._lib.kCCAlgorithmAES128, - mode_cls, - mode_const - ) - for mode_cls, mode_const in [ - (CBC, self._lib.kCCModeCBC), - (ECB, self._lib.kCCModeECB), - (CFB, self._lib.kCCModeCFB), - (CFB8, self._lib.kCCModeCFB8), - (OFB, self._lib.kCCModeOFB), - ]: - self._register_cipher_adapter( - TripleDES, - self._lib.kCCAlgorithm3DES, - mode_cls, - mode_const - ) - for mode_cls, mode_const in [ - (CBC, self._lib.kCCModeCBC), - (ECB, self._lib.kCCModeECB), - (CFB, self._lib.kCCModeCFB), - (OFB, self._lib.kCCModeOFB) - ]: - self._register_cipher_adapter( - Blowfish, - self._lib.kCCAlgorithmBlowfish, - mode_cls, - mode_const - ) - for mode_cls, mode_const in [ - (CBC, self._lib.kCCModeCBC), - (ECB, self._lib.kCCModeECB), - (CFB, self._lib.kCCModeCFB), - (OFB, self._lib.kCCModeOFB), - (CTR, self._lib.kCCModeCTR) - ]: - self._register_cipher_adapter( - CAST5, - self._lib.kCCAlgorithmCAST, - mode_cls, - mode_const - ) - self._register_cipher_adapter( - ARC4, - self._lib.kCCAlgorithmRC4, - type(None), - self._lib.kCCModeRC4 - ) - - def _check_cipher_response(self, response): - if response == self._lib.kCCSuccess: - return - elif response == self._lib.kCCAlignmentError: - # This error is not currently triggered due to a bug filed as - # rdar://15589470 - raise ValueError( - "The length of the provided data is not a multiple of " - "the block length." - ) - else: - raise InternalError( - "The backend returned an unknown error, consider filing a bug." - " Code: {0}.".format(response) - ) - - def _release_cipher_ctx(self, ctx): - """ - Called by the garbage collector and used to safely dereference and - release the context. - """ - if ctx[0] != self._ffi.NULL: - res = self._lib.CCCryptorRelease(ctx[0]) - self._check_cipher_response(res) - ctx[0] = self._ffi.NULL - - -backend = Backend() diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/ciphers.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/ciphers.py deleted file mode 100644 index 6d3ba86..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/ciphers.py +++ /dev/null @@ -1,203 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import ( - InvalidTag, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.primitives import constant_time, interfaces -from cryptography.hazmat.primitives.ciphers.modes import ( - CFB, CFB8, CTR, OFB -) - - -@utils.register_interface(interfaces.CipherContext) -class _CipherContext(object): - def __init__(self, backend, cipher, mode, operation): - self._backend = backend - self._cipher = cipher - self._mode = mode - self._operation = operation - # There is a bug in CommonCrypto where block ciphers do not raise - # kCCAlignmentError when finalizing if you supply non-block aligned - # data. To work around this we need to keep track of the block - # alignment ourselves, but only for alg+mode combos that require - # block alignment. OFB, CFB, and CTR make a block cipher algorithm - # into a stream cipher so we don't need to track them (and thus their - # block size is effectively 1 byte just like OpenSSL/CommonCrypto - # treat RC4 and other stream cipher block sizes). - # This bug has been filed as rdar://15589470 - self._bytes_processed = 0 - if (isinstance(cipher, interfaces.BlockCipherAlgorithm) and not - isinstance(mode, (OFB, CFB, CFB8, CTR))): - self._byte_block_size = cipher.block_size // 8 - else: - self._byte_block_size = 1 - - registry = self._backend._cipher_registry - try: - cipher_enum, mode_enum = registry[type(cipher), type(mode)] - except KeyError: - raise UnsupportedAlgorithm( - "cipher {0} in {1} mode is not supported " - "by this backend.".format( - cipher.name, mode.name if mode else mode), - _Reasons.UNSUPPORTED_CIPHER - ) - - ctx = self._backend._ffi.new("CCCryptorRef *") - ctx = self._backend._ffi.gc(ctx, self._backend._release_cipher_ctx) - - if isinstance(mode, interfaces.ModeWithInitializationVector): - iv_nonce = mode.initialization_vector - elif isinstance(mode, interfaces.ModeWithNonce): - iv_nonce = mode.nonce - else: - iv_nonce = self._backend._ffi.NULL - - if isinstance(mode, CTR): - mode_option = self._backend._lib.kCCModeOptionCTR_BE - else: - mode_option = 0 - - res = self._backend._lib.CCCryptorCreateWithMode( - operation, - mode_enum, cipher_enum, - self._backend._lib.ccNoPadding, iv_nonce, - cipher.key, len(cipher.key), - self._backend._ffi.NULL, 0, 0, mode_option, ctx) - self._backend._check_cipher_response(res) - - self._ctx = ctx - - def update(self, data): - # Count bytes processed to handle block alignment. - self._bytes_processed += len(data) - buf = self._backend._ffi.new( - "unsigned char[]", len(data) + self._byte_block_size - 1) - outlen = self._backend._ffi.new("size_t *") - res = self._backend._lib.CCCryptorUpdate( - self._ctx[0], data, len(data), buf, - len(data) + self._byte_block_size - 1, outlen) - self._backend._check_cipher_response(res) - return self._backend._ffi.buffer(buf)[:outlen[0]] - - def finalize(self): - # Raise error if block alignment is wrong. - if self._bytes_processed % self._byte_block_size: - raise ValueError( - "The length of the provided data is not a multiple of " - "the block length." - ) - buf = self._backend._ffi.new("unsigned char[]", self._byte_block_size) - outlen = self._backend._ffi.new("size_t *") - res = self._backend._lib.CCCryptorFinal( - self._ctx[0], buf, len(buf), outlen) - self._backend._check_cipher_response(res) - self._backend._release_cipher_ctx(self._ctx) - return self._backend._ffi.buffer(buf)[:outlen[0]] - - -@utils.register_interface(interfaces.AEADCipherContext) -@utils.register_interface(interfaces.AEADEncryptionContext) -class _GCMCipherContext(object): - def __init__(self, backend, cipher, mode, operation): - self._backend = backend - self._cipher = cipher - self._mode = mode - self._operation = operation - self._tag = None - - registry = self._backend._cipher_registry - try: - cipher_enum, mode_enum = registry[type(cipher), type(mode)] - except KeyError: - raise UnsupportedAlgorithm( - "cipher {0} in {1} mode is not supported " - "by this backend.".format( - cipher.name, mode.name if mode else mode), - _Reasons.UNSUPPORTED_CIPHER - ) - - ctx = self._backend._ffi.new("CCCryptorRef *") - ctx = self._backend._ffi.gc(ctx, self._backend._release_cipher_ctx) - - self._ctx = ctx - - res = self._backend._lib.CCCryptorCreateWithMode( - operation, - mode_enum, cipher_enum, - self._backend._lib.ccNoPadding, - self._backend._ffi.NULL, - cipher.key, len(cipher.key), - self._backend._ffi.NULL, 0, 0, 0, self._ctx) - self._backend._check_cipher_response(res) - - res = self._backend._lib.CCCryptorGCMAddIV( - self._ctx[0], - mode.initialization_vector, - len(mode.initialization_vector) - ) - self._backend._check_cipher_response(res) - # CommonCrypto has a bug where calling update without at least one - # call to authenticate_additional_data will result in null byte output - # for ciphertext. The following empty byte string call prevents the - # issue, which is present in at least 10.8 and 10.9. - # Filed as rdar://18314544 - self.authenticate_additional_data(b"") - - def update(self, data): - buf = self._backend._ffi.new("unsigned char[]", len(data)) - args = (self._ctx[0], data, len(data), buf) - if self._operation == self._backend._lib.kCCEncrypt: - res = self._backend._lib.CCCryptorGCMEncrypt(*args) - else: - res = self._backend._lib.CCCryptorGCMDecrypt(*args) - - self._backend._check_cipher_response(res) - return self._backend._ffi.buffer(buf)[:] - - def finalize(self): - # CommonCrypto has a yet another bug where you must make at least one - # call to update. If you pass just AAD and call finalize without a call - # to update you'll get null bytes for tag. The following update call - # prevents this issue, which is present in at least 10.8 and 10.9. - # Filed as rdar://18314580 - self.update(b"") - tag_size = self._cipher.block_size // 8 - tag_buf = self._backend._ffi.new("unsigned char[]", tag_size) - tag_len = self._backend._ffi.new("size_t *", tag_size) - res = self._backend._lib.CCCryptorGCMFinal( - self._ctx[0], tag_buf, tag_len - ) - self._backend._check_cipher_response(res) - self._backend._release_cipher_ctx(self._ctx) - self._tag = self._backend._ffi.buffer(tag_buf)[:] - if (self._operation == self._backend._lib.kCCDecrypt and - not constant_time.bytes_eq( - self._tag[:len(self._mode.tag)], self._mode.tag - )): - raise InvalidTag - return b"" - - def authenticate_additional_data(self, data): - res = self._backend._lib.CCCryptorGCMAddAAD( - self._ctx[0], data, len(data) - ) - self._backend._check_cipher_response(res) - - @property - def tag(self): - return self._tag diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hashes.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hashes.py deleted file mode 100644 index ebad720..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hashes.py +++ /dev/null @@ -1,62 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.HashContext) -class _HashContext(object): - def __init__(self, backend, algorithm, ctx=None): - self.algorithm = algorithm - self._backend = backend - - if ctx is None: - try: - methods = self._backend._hash_mapping[self.algorithm.name] - except KeyError: - raise UnsupportedAlgorithm( - "{0} is not a supported hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - ctx = self._backend._ffi.new(methods.ctx) - res = methods.hash_init(ctx) - assert res == 1 - - self._ctx = ctx - - def copy(self): - methods = self._backend._hash_mapping[self.algorithm.name] - new_ctx = self._backend._ffi.new(methods.ctx) - # CommonCrypto has no APIs for copying hashes, so we have to copy the - # underlying struct. - new_ctx[0] = self._ctx[0] - - return _HashContext(self._backend, self.algorithm, ctx=new_ctx) - - def update(self, data): - methods = self._backend._hash_mapping[self.algorithm.name] - res = methods.hash_update(self._ctx, data, len(data)) - assert res == 1 - - def finalize(self): - methods = self._backend._hash_mapping[self.algorithm.name] - buf = self._backend._ffi.new("unsigned char[]", - self.algorithm.digest_size) - res = methods.hash_final(buf, self._ctx) - assert res == 1 - return self._backend._ffi.buffer(buf)[:] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hmac.py deleted file mode 100644 index ec3a878..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/commoncrypto/hmac.py +++ /dev/null @@ -1,58 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.HashContext) -class _HMACContext(object): - def __init__(self, backend, key, algorithm, ctx=None): - self.algorithm = algorithm - self._backend = backend - if ctx is None: - ctx = self._backend._ffi.new("CCHmacContext *") - try: - alg = self._backend._supported_hmac_algorithms[algorithm.name] - except KeyError: - raise UnsupportedAlgorithm( - "{0} is not a supported HMAC hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - - self._backend._lib.CCHmacInit(ctx, alg, key, len(key)) - - self._ctx = ctx - self._key = key - - def copy(self): - copied_ctx = self._backend._ffi.new("CCHmacContext *") - # CommonCrypto has no APIs for copying HMACs, so we have to copy the - # underlying struct. - copied_ctx[0] = self._ctx[0] - return _HMACContext( - self._backend, self._key, self.algorithm, ctx=copied_ctx - ) - - def update(self, data): - self._backend._lib.CCHmacUpdate(self._ctx, data, len(data)) - - def finalize(self): - buf = self._backend._ffi.new("unsigned char[]", - self.algorithm.digest_size) - self._backend._lib.CCHmacFinal(self._ctx, buf) - return self._backend._ffi.buffer(buf)[:] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/interfaces.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/interfaces.py deleted file mode 100644 index f471b94..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/interfaces.py +++ /dev/null @@ -1,308 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import abc - -import six - - -@six.add_metaclass(abc.ABCMeta) -class CipherBackend(object): - @abc.abstractmethod - def cipher_supported(self, cipher, mode): - """ - Return True if the given cipher and mode are supported. - """ - - @abc.abstractmethod - def create_symmetric_encryption_ctx(self, cipher, mode): - """ - Get a CipherContext that can be used for encryption. - """ - - @abc.abstractmethod - def create_symmetric_decryption_ctx(self, cipher, mode): - """ - Get a CipherContext that can be used for decryption. - """ - - -@six.add_metaclass(abc.ABCMeta) -class HashBackend(object): - @abc.abstractmethod - def hash_supported(self, algorithm): - """ - Return True if the hash algorithm is supported by this backend. - """ - - @abc.abstractmethod - def create_hash_ctx(self, algorithm): - """ - Create a HashContext for calculating a message digest. - """ - - -@six.add_metaclass(abc.ABCMeta) -class HMACBackend(object): - @abc.abstractmethod - def hmac_supported(self, algorithm): - """ - Return True if the hash algorithm is supported for HMAC by this - backend. - """ - - @abc.abstractmethod - def create_hmac_ctx(self, key, algorithm): - """ - Create a HashContext for calculating a message authentication code. - """ - - -@six.add_metaclass(abc.ABCMeta) -class CMACBackend(object): - @abc.abstractmethod - def cmac_algorithm_supported(self, algorithm): - """ - Returns True if the block cipher is supported for CMAC by this backend - """ - - @abc.abstractmethod - def create_cmac_ctx(self, algorithm): - """ - Create a CMACContext for calculating a message authentication code. - """ - - -@six.add_metaclass(abc.ABCMeta) -class PBKDF2HMACBackend(object): - @abc.abstractmethod - def pbkdf2_hmac_supported(self, algorithm): - """ - Return True if the hash algorithm is supported for PBKDF2 by this - backend. - """ - - @abc.abstractmethod - def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations, - key_material): - """ - Return length bytes derived from provided PBKDF2 parameters. - """ - - -@six.add_metaclass(abc.ABCMeta) -class RSABackend(object): - @abc.abstractmethod - def generate_rsa_private_key(self, public_exponent, key_size): - """ - Generate an RSAPrivateKey instance with public_exponent and a modulus - of key_size bits. - """ - - @abc.abstractmethod - def create_rsa_signature_ctx(self, private_key, padding, algorithm): - """ - Returns an object conforming to the AsymmetricSignatureContext - interface. - """ - - @abc.abstractmethod - def create_rsa_verification_ctx(self, public_key, signature, padding, - algorithm): - """ - Returns an object conforming to the AsymmetricVerificationContext - interface. - """ - - @abc.abstractmethod - def mgf1_hash_supported(self, algorithm): - """ - Return True if the hash algorithm is supported for MGF1 in PSS. - """ - - @abc.abstractmethod - def decrypt_rsa(self, private_key, ciphertext, padding): - """ - Returns decrypted bytes. - """ - - @abc.abstractmethod - def encrypt_rsa(self, public_key, plaintext, padding): - """ - Returns encrypted bytes. - """ - - @abc.abstractmethod - def rsa_padding_supported(self, padding): - """ - Returns True if the backend supports the given padding options. - """ - - @abc.abstractmethod - def generate_rsa_parameters_supported(self, public_exponent, key_size): - """ - Returns True if the backend supports the given parameters for key - generation. - """ - - @abc.abstractmethod - def load_rsa_private_numbers(self, numbers): - """ - Returns an RSAPrivateKey provider. - """ - - @abc.abstractmethod - def load_rsa_public_numbers(self, numbers): - """ - Returns an RSAPublicKey provider. - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSABackend(object): - @abc.abstractmethod - def generate_dsa_parameters(self, key_size): - """ - Generate a DSAParameters instance with a modulus of key_size bits. - """ - - @abc.abstractmethod - def generate_dsa_private_key(self, parameters): - """ - Generate a DSAPrivateKey instance with parameters as a DSAParameters - object. - """ - - @abc.abstractmethod - def generate_dsa_private_key_and_parameters(self, key_size): - """ - Generate a DSAPrivateKey instance using key size only. - """ - - @abc.abstractmethod - def create_dsa_signature_ctx(self, private_key, algorithm): - """ - Returns an object conforming to the AsymmetricSignatureContext - interface. - """ - - @abc.abstractmethod - def create_dsa_verification_ctx(self, public_key, signature, algorithm): - """ - Returns an object conforming to the AsymmetricVerificationContext - interface. - """ - - @abc.abstractmethod - def dsa_hash_supported(self, algorithm): - """ - Return True if the hash algorithm is supported by the backend for DSA. - """ - - @abc.abstractmethod - def dsa_parameters_supported(self, p, q, g): - """ - Return True if the parameters are supported by the backend for DSA. - """ - - @abc.abstractmethod - def load_dsa_private_numbers(self, numbers): - """ - Returns a DSAPrivateKey provider. - """ - - @abc.abstractmethod - def load_dsa_public_numbers(self, numbers): - """ - Returns a DSAPublicKey provider. - """ - - @abc.abstractmethod - def load_dsa_parameter_numbers(self, numbers): - """ - Returns a DSAParameters provider. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurveBackend(object): - @abc.abstractmethod - def elliptic_curve_signature_algorithm_supported( - self, signature_algorithm, curve - ): - """ - Returns True if the backend supports the named elliptic curve with the - specified signature algorithm. - """ - - @abc.abstractmethod - def elliptic_curve_supported(self, curve): - """ - Returns True if the backend supports the named elliptic curve. - """ - - @abc.abstractmethod - def generate_elliptic_curve_private_key(self, curve): - """ - Return an object conforming to the EllipticCurvePrivateKey interface. - """ - - @abc.abstractmethod - def load_elliptic_curve_public_numbers(self, numbers): - """ - Return an EllipticCurvePublicKey provider using the given numbers. - """ - - @abc.abstractmethod - def load_elliptic_curve_private_numbers(self, numbers): - """ - Return an EllipticCurvePublicKey provider using the given numbers. - """ - - -@six.add_metaclass(abc.ABCMeta) -class PEMSerializationBackend(object): - @abc.abstractmethod - def load_pem_private_key(self, data, password): - """ - Loads a private key from PEM encoded data, using the provided password - if the data is encrypted. - """ - - @abc.abstractmethod - def load_pem_public_key(self, data): - """ - Loads a public key from PEM encoded data. - """ - - -@six.add_metaclass(abc.ABCMeta) -class TraditionalOpenSSLSerializationBackend(object): - @abc.abstractmethod - def load_traditional_openssl_pem_private_key(self, data, password): - """ - Load a private key from PEM encoded data, using password if the data - is encrypted. - """ - - -@six.add_metaclass(abc.ABCMeta) -class PKCS8SerializationBackend(object): - @abc.abstractmethod - def load_pkcs8_pem_private_key(self, data, password): - """ - Load a private key from PKCS8 encoded data, using password if the data - is encrypted. - """ diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/multibackend.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/multibackend.py deleted file mode 100644 index ce9e6de..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/multibackend.py +++ /dev/null @@ -1,397 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import warnings - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.backends.interfaces import ( - CMACBackend, CipherBackend, DSABackend, EllipticCurveBackend, HMACBackend, - HashBackend, PBKDF2HMACBackend, PEMSerializationBackend, - PKCS8SerializationBackend, RSABackend, - TraditionalOpenSSLSerializationBackend -) - - -@utils.register_interface(CMACBackend) -@utils.register_interface(CipherBackend) -@utils.register_interface(HashBackend) -@utils.register_interface(HMACBackend) -@utils.register_interface(PBKDF2HMACBackend) -@utils.register_interface(PKCS8SerializationBackend) -@utils.register_interface(RSABackend) -@utils.register_interface(TraditionalOpenSSLSerializationBackend) -@utils.register_interface(DSABackend) -@utils.register_interface(EllipticCurveBackend) -@utils.register_interface(PEMSerializationBackend) -class MultiBackend(object): - name = "multibackend" - - def __init__(self, backends): - self._backends = backends - - def _filtered_backends(self, interface): - for b in self._backends: - if isinstance(b, interface): - yield b - - def cipher_supported(self, algorithm, mode): - return any( - b.cipher_supported(algorithm, mode) - for b in self._filtered_backends(CipherBackend) - ) - - def create_symmetric_encryption_ctx(self, algorithm, mode): - for b in self._filtered_backends(CipherBackend): - try: - return b.create_symmetric_encryption_ctx(algorithm, mode) - except UnsupportedAlgorithm: - pass - raise UnsupportedAlgorithm( - "cipher {0} in {1} mode is not supported by this backend.".format( - algorithm.name, mode.name if mode else mode), - _Reasons.UNSUPPORTED_CIPHER - ) - - def create_symmetric_decryption_ctx(self, algorithm, mode): - for b in self._filtered_backends(CipherBackend): - try: - return b.create_symmetric_decryption_ctx(algorithm, mode) - except UnsupportedAlgorithm: - pass - raise UnsupportedAlgorithm( - "cipher {0} in {1} mode is not supported by this backend.".format( - algorithm.name, mode.name if mode else mode), - _Reasons.UNSUPPORTED_CIPHER - ) - - def hash_supported(self, algorithm): - return any( - b.hash_supported(algorithm) - for b in self._filtered_backends(HashBackend) - ) - - def create_hash_ctx(self, algorithm): - for b in self._filtered_backends(HashBackend): - try: - return b.create_hash_ctx(algorithm) - except UnsupportedAlgorithm: - pass - raise UnsupportedAlgorithm( - "{0} is not a supported hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - - def hmac_supported(self, algorithm): - return any( - b.hmac_supported(algorithm) - for b in self._filtered_backends(HMACBackend) - ) - - def create_hmac_ctx(self, key, algorithm): - for b in self._filtered_backends(HMACBackend): - try: - return b.create_hmac_ctx(key, algorithm) - except UnsupportedAlgorithm: - pass - raise UnsupportedAlgorithm( - "{0} is not a supported hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - - def pbkdf2_hmac_supported(self, algorithm): - return any( - b.pbkdf2_hmac_supported(algorithm) - for b in self._filtered_backends(PBKDF2HMACBackend) - ) - - def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations, - key_material): - for b in self._filtered_backends(PBKDF2HMACBackend): - try: - return b.derive_pbkdf2_hmac( - algorithm, length, salt, iterations, key_material - ) - except UnsupportedAlgorithm: - pass - raise UnsupportedAlgorithm( - "{0} is not a supported hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - - def generate_rsa_private_key(self, public_exponent, key_size): - for b in self._filtered_backends(RSABackend): - return b.generate_rsa_private_key(public_exponent, key_size) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def generate_rsa_parameters_supported(self, public_exponent, key_size): - for b in self._filtered_backends(RSABackend): - return b.generate_rsa_parameters_supported( - public_exponent, key_size - ) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def create_rsa_signature_ctx(self, private_key, padding, algorithm): - for b in self._filtered_backends(RSABackend): - return b.create_rsa_signature_ctx(private_key, padding, algorithm) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def create_rsa_verification_ctx(self, public_key, signature, padding, - algorithm): - for b in self._filtered_backends(RSABackend): - return b.create_rsa_verification_ctx(public_key, signature, - padding, algorithm) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def mgf1_hash_supported(self, algorithm): - for b in self._filtered_backends(RSABackend): - return b.mgf1_hash_supported(algorithm) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def decrypt_rsa(self, private_key, ciphertext, padding): - for b in self._filtered_backends(RSABackend): - return b.decrypt_rsa(private_key, ciphertext, padding) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def encrypt_rsa(self, public_key, plaintext, padding): - for b in self._filtered_backends(RSABackend): - return b.encrypt_rsa(public_key, plaintext, padding) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def rsa_padding_supported(self, padding): - for b in self._filtered_backends(RSABackend): - return b.rsa_padding_supported(padding) - raise UnsupportedAlgorithm("RSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def load_rsa_private_numbers(self, numbers): - for b in self._filtered_backends(RSABackend): - return b.load_rsa_private_numbers(numbers) - - raise UnsupportedAlgorithm("RSA is not supported by the backend", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def load_rsa_public_numbers(self, numbers): - for b in self._filtered_backends(RSABackend): - return b.load_rsa_public_numbers(numbers) - - raise UnsupportedAlgorithm("RSA is not supported by the backend", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def generate_dsa_parameters(self, key_size): - for b in self._filtered_backends(DSABackend): - return b.generate_dsa_parameters(key_size) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def generate_dsa_private_key(self, parameters): - for b in self._filtered_backends(DSABackend): - return b.generate_dsa_private_key(parameters) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def generate_dsa_private_key_and_parameters(self, key_size): - for b in self._filtered_backends(DSABackend): - return b.generate_dsa_private_key_and_parameters(key_size) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def create_dsa_verification_ctx(self, public_key, signature, algorithm): - for b in self._filtered_backends(DSABackend): - return b.create_dsa_verification_ctx(public_key, signature, - algorithm) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def create_dsa_signature_ctx(self, private_key, algorithm): - for b in self._filtered_backends(DSABackend): - return b.create_dsa_signature_ctx(private_key, algorithm) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def dsa_hash_supported(self, algorithm): - for b in self._filtered_backends(DSABackend): - return b.dsa_hash_supported(algorithm) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def dsa_parameters_supported(self, p, q, g): - for b in self._filtered_backends(DSABackend): - return b.dsa_parameters_supported(p, q, g) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def load_dsa_public_numbers(self, numbers): - for b in self._filtered_backends(DSABackend): - return b.load_dsa_public_numbers(numbers) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def load_dsa_private_numbers(self, numbers): - for b in self._filtered_backends(DSABackend): - return b.load_dsa_private_numbers(numbers) - raise UnsupportedAlgorithm("DSA is not supported by the backend.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def cmac_algorithm_supported(self, algorithm): - return any( - b.cmac_algorithm_supported(algorithm) - for b in self._filtered_backends(CMACBackend) - ) - - def create_cmac_ctx(self, algorithm): - for b in self._filtered_backends(CMACBackend): - try: - return b.create_cmac_ctx(algorithm) - except UnsupportedAlgorithm: - pass - raise UnsupportedAlgorithm("This backend does not support CMAC.", - _Reasons.UNSUPPORTED_CIPHER) - - def elliptic_curve_supported(self, curve): - return any( - b.elliptic_curve_supported(curve) - for b in self._filtered_backends(EllipticCurveBackend) - ) - - def elliptic_curve_signature_algorithm_supported( - self, signature_algorithm, curve - ): - return any( - b.elliptic_curve_signature_algorithm_supported( - signature_algorithm, curve - ) - for b in self._filtered_backends(EllipticCurveBackend) - ) - - def generate_elliptic_curve_private_key(self, curve): - for b in self._filtered_backends(EllipticCurveBackend): - try: - return b.generate_elliptic_curve_private_key(curve) - except UnsupportedAlgorithm: - continue - - raise UnsupportedAlgorithm( - "This backend does not support this elliptic curve.", - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - def elliptic_curve_private_key_from_numbers(self, numbers): - warnings.warn( - "elliptic_curve_private_key_from_numbers is deprecated and will " - "be removed in a future version.", - utils.DeprecatedIn06, - stacklevel=2 - ) - for b in self._filtered_backends(EllipticCurveBackend): - try: - return b.elliptic_curve_private_key_from_numbers(numbers) - except UnsupportedAlgorithm: - continue - - raise UnsupportedAlgorithm( - "This backend does not support this elliptic curve.", - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - def load_elliptic_curve_private_numbers(self, numbers): - for b in self._filtered_backends(EllipticCurveBackend): - try: - return b.load_elliptic_curve_private_numbers(numbers) - except UnsupportedAlgorithm: - continue - - raise UnsupportedAlgorithm( - "This backend does not support this elliptic curve.", - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - def elliptic_curve_public_key_from_numbers(self, numbers): - warnings.warn( - "elliptic_curve_public_key_from_numbers is deprecated and will " - "be removed in a future version.", - utils.DeprecatedIn06, - stacklevel=2 - ) - for b in self._filtered_backends(EllipticCurveBackend): - try: - return b.elliptic_curve_public_key_from_numbers(numbers) - except UnsupportedAlgorithm: - continue - - raise UnsupportedAlgorithm( - "This backend does not support this elliptic curve.", - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - def load_elliptic_curve_public_numbers(self, numbers): - for b in self._filtered_backends(EllipticCurveBackend): - try: - return b.load_elliptic_curve_public_numbers(numbers) - except UnsupportedAlgorithm: - continue - - raise UnsupportedAlgorithm( - "This backend does not support this elliptic curve.", - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - def load_pem_private_key(self, data, password): - for b in self._filtered_backends(PEMSerializationBackend): - return b.load_pem_private_key(data, password) - - raise UnsupportedAlgorithm( - "This backend does not support this key serialization.", - _Reasons.UNSUPPORTED_SERIALIZATION - ) - - def load_pem_public_key(self, data): - for b in self._filtered_backends(PEMSerializationBackend): - return b.load_pem_public_key(data) - - raise UnsupportedAlgorithm( - "This backend does not support this key serialization.", - _Reasons.UNSUPPORTED_SERIALIZATION - ) - - def load_pkcs8_pem_private_key(self, data, password): - for b in self._filtered_backends(PKCS8SerializationBackend): - return b.load_pkcs8_pem_private_key(data, password) - - raise UnsupportedAlgorithm( - "This backend does not support this key serialization.", - _Reasons.UNSUPPORTED_SERIALIZATION - ) - - def load_traditional_openssl_pem_private_key(self, data, password): - for b in self._filtered_backends( - TraditionalOpenSSLSerializationBackend - ): - return b.load_traditional_openssl_pem_private_key(data, password) - - raise UnsupportedAlgorithm( - "This backend does not support this key serialization.", - _Reasons.UNSUPPORTED_SERIALIZATION - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/__init__.py deleted file mode 100644 index 25885e1..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography.hazmat.backends.openssl.backend import backend - - -__all__ = ["backend"] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/backend.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/backend.py deleted file mode 100644 index 9a36674..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/backend.py +++ /dev/null @@ -1,1162 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import collections -import itertools -import warnings -from contextlib import contextmanager - -import six - -from cryptography import utils -from cryptography.exceptions import ( - InternalError, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import ( - CMACBackend, CipherBackend, DSABackend, EllipticCurveBackend, HMACBackend, - HashBackend, PBKDF2HMACBackend, PEMSerializationBackend, - PKCS8SerializationBackend, RSABackend, - TraditionalOpenSSLSerializationBackend -) -from cryptography.hazmat.backends.openssl.ciphers import ( - _AESCTRCipherContext, _CipherContext -) -from cryptography.hazmat.backends.openssl.cmac import _CMACContext -from cryptography.hazmat.backends.openssl.dsa import ( - _DSAParameters, _DSAPrivateKey, _DSAPublicKey, - _DSASignatureContext, _DSAVerificationContext -) -from cryptography.hazmat.backends.openssl.ec import ( - _EllipticCurvePrivateKey, _EllipticCurvePublicKey -) -from cryptography.hazmat.backends.openssl.hashes import _HashContext -from cryptography.hazmat.backends.openssl.hmac import _HMACContext -from cryptography.hazmat.backends.openssl.rsa import ( - _RSAPrivateKey, _RSAPublicKey, _RSASignatureContext, - _RSAVerificationContext -) -from cryptography.hazmat.bindings.openssl.binding import Binding -from cryptography.hazmat.primitives import hashes -from cryptography.hazmat.primitives.asymmetric import dsa, ec, rsa -from cryptography.hazmat.primitives.asymmetric.padding import ( - MGF1, OAEP, PKCS1v15, PSS -) -from cryptography.hazmat.primitives.ciphers.algorithms import ( - AES, ARC4, Blowfish, CAST5, Camellia, IDEA, SEED, TripleDES -) -from cryptography.hazmat.primitives.ciphers.modes import ( - CBC, CFB, CFB8, CTR, ECB, GCM, OFB -) - - -_MemoryBIO = collections.namedtuple("_MemoryBIO", ["bio", "char_ptr"]) -_OpenSSLError = collections.namedtuple("_OpenSSLError", - ["code", "lib", "func", "reason"]) - - -@utils.register_interface(CipherBackend) -@utils.register_interface(CMACBackend) -@utils.register_interface(DSABackend) -@utils.register_interface(EllipticCurveBackend) -@utils.register_interface(HashBackend) -@utils.register_interface(HMACBackend) -@utils.register_interface(PBKDF2HMACBackend) -@utils.register_interface(PKCS8SerializationBackend) -@utils.register_interface(RSABackend) -@utils.register_interface(TraditionalOpenSSLSerializationBackend) -@utils.register_interface(PEMSerializationBackend) -class Backend(object): - """ - OpenSSL API binding interfaces. - """ - name = "openssl" - - def __init__(self): - self._binding = Binding() - self._ffi = self._binding.ffi - self._lib = self._binding.lib - - self._binding.init_static_locks() - - # adds all ciphers/digests for EVP - self._lib.OpenSSL_add_all_algorithms() - # registers available SSL/TLS ciphers and digests - self._lib.SSL_library_init() - # loads error strings for libcrypto and libssl functions - self._lib.SSL_load_error_strings() - - self._cipher_registry = {} - self._register_default_ciphers() - self.activate_osrandom_engine() - - def activate_builtin_random(self): - # Obtain a new structural reference. - e = self._lib.ENGINE_get_default_RAND() - if e != self._ffi.NULL: - self._lib.ENGINE_unregister_RAND(e) - # Reset the RNG to use the new engine. - self._lib.RAND_cleanup() - # decrement the structural reference from get_default_RAND - res = self._lib.ENGINE_finish(e) - assert res == 1 - - def activate_osrandom_engine(self): - # Unregister and free the current engine. - self.activate_builtin_random() - # Fetches an engine by id and returns it. This creates a structural - # reference. - e = self._lib.ENGINE_by_id(self._lib.Cryptography_osrandom_engine_id) - assert e != self._ffi.NULL - # Initialize the engine for use. This adds a functional reference. - res = self._lib.ENGINE_init(e) - assert res == 1 - # Set the engine as the default RAND provider. - res = self._lib.ENGINE_set_default_RAND(e) - assert res == 1 - # Decrement the structural ref incremented by ENGINE_by_id. - res = self._lib.ENGINE_free(e) - assert res == 1 - # Decrement the functional ref incremented by ENGINE_init. - res = self._lib.ENGINE_finish(e) - assert res == 1 - # Reset the RNG to use the new engine. - self._lib.RAND_cleanup() - - def openssl_version_text(self): - """ - Friendly string name of the loaded OpenSSL library. This is not - necessarily the same version as it was compiled against. - - Example: OpenSSL 1.0.1e 11 Feb 2013 - """ - return self._ffi.string( - self._lib.SSLeay_version(self._lib.SSLEAY_VERSION) - ).decode("ascii") - - def create_hmac_ctx(self, key, algorithm): - return _HMACContext(self, key, algorithm) - - def hash_supported(self, algorithm): - digest = self._lib.EVP_get_digestbyname(algorithm.name.encode("ascii")) - return digest != self._ffi.NULL - - def hmac_supported(self, algorithm): - return self.hash_supported(algorithm) - - def create_hash_ctx(self, algorithm): - return _HashContext(self, algorithm) - - def cipher_supported(self, cipher, mode): - if self._evp_cipher_supported(cipher, mode): - return True - elif isinstance(mode, CTR) and isinstance(cipher, AES): - return True - else: - return False - - def _evp_cipher_supported(self, cipher, mode): - try: - adapter = self._cipher_registry[type(cipher), type(mode)] - except KeyError: - return False - evp_cipher = adapter(self, cipher, mode) - return self._ffi.NULL != evp_cipher - - def register_cipher_adapter(self, cipher_cls, mode_cls, adapter): - if (cipher_cls, mode_cls) in self._cipher_registry: - raise ValueError("Duplicate registration for: {0} {1}.".format( - cipher_cls, mode_cls) - ) - self._cipher_registry[cipher_cls, mode_cls] = adapter - - def _register_default_ciphers(self): - for mode_cls in [CBC, CTR, ECB, OFB, CFB, CFB8]: - self.register_cipher_adapter( - AES, - mode_cls, - GetCipherByName("{cipher.name}-{cipher.key_size}-{mode.name}") - ) - for mode_cls in [CBC, CTR, ECB, OFB, CFB]: - self.register_cipher_adapter( - Camellia, - mode_cls, - GetCipherByName("{cipher.name}-{cipher.key_size}-{mode.name}") - ) - for mode_cls in [CBC, CFB, CFB8, OFB]: - self.register_cipher_adapter( - TripleDES, - mode_cls, - GetCipherByName("des-ede3-{mode.name}") - ) - self.register_cipher_adapter( - TripleDES, - ECB, - GetCipherByName("des-ede3") - ) - for mode_cls in [CBC, CFB, OFB, ECB]: - self.register_cipher_adapter( - Blowfish, - mode_cls, - GetCipherByName("bf-{mode.name}") - ) - for mode_cls in [CBC, CFB, OFB, ECB]: - self.register_cipher_adapter( - SEED, - mode_cls, - GetCipherByName("seed-{mode.name}") - ) - for cipher_cls, mode_cls in itertools.product( - [CAST5, IDEA], - [CBC, OFB, CFB, ECB], - ): - self.register_cipher_adapter( - cipher_cls, - mode_cls, - GetCipherByName("{cipher.name}-{mode.name}") - ) - self.register_cipher_adapter( - ARC4, - type(None), - GetCipherByName("rc4") - ) - self.register_cipher_adapter( - AES, - GCM, - GetCipherByName("{cipher.name}-{cipher.key_size}-{mode.name}") - ) - - def create_symmetric_encryption_ctx(self, cipher, mode): - if (isinstance(mode, CTR) and isinstance(cipher, AES) - and not self._evp_cipher_supported(cipher, mode)): - # This is needed to provide support for AES CTR mode in OpenSSL - # 0.9.8. It can be removed when we drop 0.9.8 support (RHEL 5 - # extended life ends 2020). - return _AESCTRCipherContext(self, cipher, mode) - else: - return _CipherContext(self, cipher, mode, _CipherContext._ENCRYPT) - - def create_symmetric_decryption_ctx(self, cipher, mode): - if (isinstance(mode, CTR) and isinstance(cipher, AES) - and not self._evp_cipher_supported(cipher, mode)): - # This is needed to provide support for AES CTR mode in OpenSSL - # 0.9.8. It can be removed when we drop 0.9.8 support (RHEL 5 - # extended life ends 2020). - return _AESCTRCipherContext(self, cipher, mode) - else: - return _CipherContext(self, cipher, mode, _CipherContext._DECRYPT) - - def pbkdf2_hmac_supported(self, algorithm): - if self._lib.Cryptography_HAS_PBKDF2_HMAC: - return self.hmac_supported(algorithm) - else: - # OpenSSL < 1.0.0 has an explicit PBKDF2-HMAC-SHA1 function, - # so if the PBKDF2_HMAC function is missing we only support - # SHA1 via PBKDF2_HMAC_SHA1. - return isinstance(algorithm, hashes.SHA1) - - def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations, - key_material): - buf = self._ffi.new("char[]", length) - if self._lib.Cryptography_HAS_PBKDF2_HMAC: - evp_md = self._lib.EVP_get_digestbyname( - algorithm.name.encode("ascii")) - assert evp_md != self._ffi.NULL - res = self._lib.PKCS5_PBKDF2_HMAC( - key_material, - len(key_material), - salt, - len(salt), - iterations, - evp_md, - length, - buf - ) - assert res == 1 - else: - if not isinstance(algorithm, hashes.SHA1): - raise UnsupportedAlgorithm( - "This version of OpenSSL only supports PBKDF2HMAC with " - "SHA1.", - _Reasons.UNSUPPORTED_HASH - ) - res = self._lib.PKCS5_PBKDF2_HMAC_SHA1( - key_material, - len(key_material), - salt, - len(salt), - iterations, - length, - buf - ) - assert res == 1 - - return self._ffi.buffer(buf)[:] - - def _err_string(self, code): - err_buf = self._ffi.new("char[]", 256) - self._lib.ERR_error_string_n(code, err_buf, 256) - return self._ffi.string(err_buf, 256)[:] - - def _consume_errors(self): - errors = [] - while True: - code = self._lib.ERR_get_error() - if code == 0: - break - - lib = self._lib.ERR_GET_LIB(code) - func = self._lib.ERR_GET_FUNC(code) - reason = self._lib.ERR_GET_REASON(code) - - errors.append(_OpenSSLError(code, lib, func, reason)) - return errors - - def _unknown_error(self, error): - return InternalError( - "Unknown error code {0} from OpenSSL, " - "you should probably file a bug. {1}.".format( - error.code, self._err_string(error.code) - ) - ) - - def _bn_to_int(self, bn): - if six.PY3: - # Python 3 has constant time from_bytes, so use that. - - bn_num_bytes = (self._lib.BN_num_bits(bn) + 7) // 8 - bin_ptr = self._ffi.new("unsigned char[]", bn_num_bytes) - bin_len = self._lib.BN_bn2bin(bn, bin_ptr) - assert bin_len > 0 - assert bin_ptr != self._ffi.NULL - return int.from_bytes(self._ffi.buffer(bin_ptr)[:bin_len], "big") - - else: - # Under Python 2 the best we can do is hex() - - hex_cdata = self._lib.BN_bn2hex(bn) - assert hex_cdata != self._ffi.NULL - hex_str = self._ffi.string(hex_cdata) - self._lib.OPENSSL_free(hex_cdata) - return int(hex_str, 16) - - def _int_to_bn(self, num, bn=None): - """ - Converts a python integer to a BIGNUM. The returned BIGNUM will not - be garbage collected (to support adding them to structs that take - ownership of the object). Be sure to register it for GC if it will - be discarded after use. - """ - - if bn is None: - bn = self._ffi.NULL - - if six.PY3: - # Python 3 has constant time to_bytes, so use that. - - binary = num.to_bytes(int(num.bit_length() / 8.0 + 1), "big") - bn_ptr = self._lib.BN_bin2bn(binary, len(binary), bn) - assert bn_ptr != self._ffi.NULL - return bn_ptr - - else: - # Under Python 2 the best we can do is hex() - - hex_num = hex(num).rstrip("L").lstrip("0x").encode("ascii") or b"0" - bn_ptr = self._ffi.new("BIGNUM **") - bn_ptr[0] = bn - res = self._lib.BN_hex2bn(bn_ptr, hex_num) - assert res != 0 - assert bn_ptr[0] != self._ffi.NULL - return bn_ptr[0] - - def generate_rsa_private_key(self, public_exponent, key_size): - rsa._verify_rsa_parameters(public_exponent, key_size) - - rsa_cdata = self._lib.RSA_new() - assert rsa_cdata != self._ffi.NULL - rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) - - bn = self._int_to_bn(public_exponent) - bn = self._ffi.gc(bn, self._lib.BN_free) - - res = self._lib.RSA_generate_key_ex( - rsa_cdata, key_size, bn, self._ffi.NULL - ) - assert res == 1 - - return _RSAPrivateKey(self, rsa_cdata) - - def generate_rsa_parameters_supported(self, public_exponent, key_size): - return (public_exponent >= 3 and public_exponent & 1 != 0 and - key_size >= 512) - - def load_rsa_private_numbers(self, numbers): - rsa._check_private_key_components( - numbers.p, - numbers.q, - numbers.d, - numbers.dmp1, - numbers.dmq1, - numbers.iqmp, - numbers.public_numbers.e, - numbers.public_numbers.n - ) - rsa_cdata = self._lib.RSA_new() - assert rsa_cdata != self._ffi.NULL - rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) - rsa_cdata.p = self._int_to_bn(numbers.p) - rsa_cdata.q = self._int_to_bn(numbers.q) - rsa_cdata.d = self._int_to_bn(numbers.d) - rsa_cdata.dmp1 = self._int_to_bn(numbers.dmp1) - rsa_cdata.dmq1 = self._int_to_bn(numbers.dmq1) - rsa_cdata.iqmp = self._int_to_bn(numbers.iqmp) - rsa_cdata.e = self._int_to_bn(numbers.public_numbers.e) - rsa_cdata.n = self._int_to_bn(numbers.public_numbers.n) - res = self._lib.RSA_blinding_on(rsa_cdata, self._ffi.NULL) - assert res == 1 - - return _RSAPrivateKey(self, rsa_cdata) - - def load_rsa_public_numbers(self, numbers): - rsa._check_public_key_components(numbers.e, numbers.n) - rsa_cdata = self._lib.RSA_new() - assert rsa_cdata != self._ffi.NULL - rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) - rsa_cdata.e = self._int_to_bn(numbers.e) - rsa_cdata.n = self._int_to_bn(numbers.n) - res = self._lib.RSA_blinding_on(rsa_cdata, self._ffi.NULL) - assert res == 1 - - return _RSAPublicKey(self, rsa_cdata) - - def _bytes_to_bio(self, data): - """ - Return a _MemoryBIO namedtuple of (BIO, char*). - - The char* is the storage for the BIO and it must stay alive until the - BIO is finished with. - """ - data_char_p = self._ffi.new("char[]", data) - bio = self._lib.BIO_new_mem_buf( - data_char_p, len(data) - ) - assert bio != self._ffi.NULL - - return _MemoryBIO(self._ffi.gc(bio, self._lib.BIO_free), data_char_p) - - def _evp_pkey_to_private_key(self, evp_pkey): - """ - Return the appropriate type of PrivateKey given an evp_pkey cdata - pointer. - """ - - type = evp_pkey.type - - if type == self._lib.EVP_PKEY_RSA: - rsa_cdata = self._lib.EVP_PKEY_get1_RSA(evp_pkey) - assert rsa_cdata != self._ffi.NULL - rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) - return _RSAPrivateKey(self, rsa_cdata) - elif type == self._lib.EVP_PKEY_DSA: - dsa_cdata = self._lib.EVP_PKEY_get1_DSA(evp_pkey) - assert dsa_cdata != self._ffi.NULL - dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) - return _DSAPrivateKey(self, dsa_cdata) - elif (self._lib.Cryptography_HAS_EC == 1 and - type == self._lib.EVP_PKEY_EC): - ec_cdata = self._lib.EVP_PKEY_get1_EC_KEY(evp_pkey) - assert ec_cdata != self._ffi.NULL - ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) - return _EllipticCurvePrivateKey(self, ec_cdata) - else: - raise UnsupportedAlgorithm("Unsupported key type.") - - def _evp_pkey_to_public_key(self, evp_pkey): - """ - Return the appropriate type of PublicKey given an evp_pkey cdata - pointer. - """ - - type = evp_pkey.type - - if type == self._lib.EVP_PKEY_RSA: - rsa_cdata = self._lib.EVP_PKEY_get1_RSA(evp_pkey) - assert rsa_cdata != self._ffi.NULL - rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) - return _RSAPublicKey(self, rsa_cdata) - elif type == self._lib.EVP_PKEY_DSA: - dsa_cdata = self._lib.EVP_PKEY_get1_DSA(evp_pkey) - assert dsa_cdata != self._ffi.NULL - dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) - return _DSAPublicKey(self, dsa_cdata) - elif (self._lib.Cryptography_HAS_EC == 1 and - type == self._lib.EVP_PKEY_EC): - ec_cdata = self._lib.EVP_PKEY_get1_EC_KEY(evp_pkey) - assert ec_cdata != self._ffi.NULL - ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) - return _EllipticCurvePublicKey(self, ec_cdata) - else: - raise UnsupportedAlgorithm("Unsupported key type.") - - def _pem_password_cb(self, password): - """ - Generate a pem_password_cb function pointer that copied the password to - OpenSSL as required and returns the number of bytes copied. - - typedef int pem_password_cb(char *buf, int size, - int rwflag, void *userdata); - - Useful for decrypting PKCS8 files and so on. - - Returns a tuple of (cdata function pointer, callback function). - """ - - def pem_password_cb(buf, size, writing, userdata): - pem_password_cb.called += 1 - - if not password: - pem_password_cb.exception = TypeError( - "Password was not given but private key is encrypted." - ) - return 0 - elif len(password) < size: - pw_buf = self._ffi.buffer(buf, size) - pw_buf[:len(password)] = password - return len(password) - else: - pem_password_cb.exception = ValueError( - "Passwords longer than {0} bytes are not supported " - "by this backend.".format(size - 1) - ) - return 0 - - pem_password_cb.called = 0 - pem_password_cb.exception = None - - return ( - self._ffi.callback("int (char *, int, int, void *)", - pem_password_cb), - pem_password_cb - ) - - def _rsa_cdata_from_private_key(self, private_key): - ctx = self._lib.RSA_new() - assert ctx != self._ffi.NULL - ctx = self._ffi.gc(ctx, self._lib.RSA_free) - - ctx.p = self._int_to_bn(private_key.p) - ctx.q = self._int_to_bn(private_key.q) - ctx.d = self._int_to_bn(private_key.d) - ctx.e = self._int_to_bn(private_key.e) - ctx.n = self._int_to_bn(private_key.n) - ctx.dmp1 = self._int_to_bn(private_key.dmp1) - ctx.dmq1 = self._int_to_bn(private_key.dmq1) - ctx.iqmp = self._int_to_bn(private_key.iqmp) - res = self._lib.RSA_blinding_on(ctx, self._ffi.NULL) - assert res == 1 - - return ctx - - def _rsa_cdata_from_public_key(self, public_key): - ctx = self._lib.RSA_new() - assert ctx != self._ffi.NULL - ctx = self._ffi.gc(ctx, self._lib.RSA_free) - - ctx.e = self._int_to_bn(public_key.e) - ctx.n = self._int_to_bn(public_key.n) - res = self._lib.RSA_blinding_on(ctx, self._ffi.NULL) - assert res == 1 - - return ctx - - def create_rsa_signature_ctx(self, private_key, padding, algorithm): - warnings.warn( - "create_rsa_signature_ctx is deprecated and will be removed in a " - "future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - rsa_cdata = self._rsa_cdata_from_private_key(private_key) - key = _RSAPrivateKey(self, rsa_cdata) - return _RSASignatureContext(self, key, padding, algorithm) - - def create_rsa_verification_ctx(self, public_key, signature, padding, - algorithm): - warnings.warn( - "create_rsa_verification_ctx is deprecated and will be removed in " - "a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - rsa_cdata = self._rsa_cdata_from_public_key(public_key) - key = _RSAPublicKey(self, rsa_cdata) - return _RSAVerificationContext(self, key, signature, padding, - algorithm) - - def mgf1_hash_supported(self, algorithm): - warnings.warn( - "mgf1_hash_supported is deprecated and will be removed in " - "a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - return self._mgf1_hash_supported(algorithm) - - def _mgf1_hash_supported(self, algorithm): - if self._lib.Cryptography_HAS_MGF1_MD: - return self.hash_supported(algorithm) - else: - return isinstance(algorithm, hashes.SHA1) - - def rsa_padding_supported(self, padding): - if isinstance(padding, PKCS1v15): - return True - elif isinstance(padding, PSS) and isinstance(padding._mgf, MGF1): - return self._mgf1_hash_supported(padding._mgf._algorithm) - elif isinstance(padding, OAEP) and isinstance(padding._mgf, MGF1): - return isinstance(padding._mgf._algorithm, hashes.SHA1) - else: - return False - - def generate_dsa_parameters(self, key_size): - if key_size not in (1024, 2048, 3072): - raise ValueError( - "Key size must be 1024 or 2048 or 3072 bits.") - - if (self._lib.OPENSSL_VERSION_NUMBER < 0x1000000f and - key_size > 1024): - raise ValueError( - "Key size must be 1024 because OpenSSL < 1.0.0 doesn't " - "support larger key sizes.") - - ctx = self._lib.DSA_new() - assert ctx != self._ffi.NULL - ctx = self._ffi.gc(ctx, self._lib.DSA_free) - - res = self._lib.DSA_generate_parameters_ex( - ctx, key_size, self._ffi.NULL, 0, - self._ffi.NULL, self._ffi.NULL, self._ffi.NULL - ) - - assert res == 1 - - return _DSAParameters(self, ctx) - - def generate_dsa_private_key(self, parameters): - ctx = self._lib.DSA_new() - assert ctx != self._ffi.NULL - ctx = self._ffi.gc(ctx, self._lib.DSA_free) - if isinstance(parameters, dsa.DSAParameters): - ctx.p = self._int_to_bn(parameters.p) - ctx.q = self._int_to_bn(parameters.q) - ctx.g = self._int_to_bn(parameters.g) - else: - ctx.p = self._lib.BN_dup(parameters._dsa_cdata.p) - ctx.q = self._lib.BN_dup(parameters._dsa_cdata.q) - ctx.g = self._lib.BN_dup(parameters._dsa_cdata.g) - - self._lib.DSA_generate_key(ctx) - - return _DSAPrivateKey(self, ctx) - - def generate_dsa_private_key_and_parameters(self, key_size): - parameters = self.generate_dsa_parameters(key_size) - return self.generate_dsa_private_key(parameters) - - def create_dsa_signature_ctx(self, private_key, algorithm): - warnings.warn( - "create_dsa_signature_ctx is deprecated and will be removed in " - "a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - dsa_cdata = self._dsa_cdata_from_private_key(private_key) - key = _DSAPrivateKey(self, dsa_cdata) - return _DSASignatureContext(self, key, algorithm) - - def create_dsa_verification_ctx(self, public_key, signature, - algorithm): - warnings.warn( - "create_dsa_verification_ctx is deprecated and will be removed in " - "a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - dsa_cdata = self._dsa_cdata_from_public_key(public_key) - key = _DSAPublicKey(self, dsa_cdata) - return _DSAVerificationContext(self, key, signature, algorithm) - - def load_dsa_private_numbers(self, numbers): - dsa._check_dsa_private_numbers(numbers) - parameter_numbers = numbers.public_numbers.parameter_numbers - - dsa_cdata = self._lib.DSA_new() - assert dsa_cdata != self._ffi.NULL - dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) - - dsa_cdata.p = self._int_to_bn(parameter_numbers.p) - dsa_cdata.q = self._int_to_bn(parameter_numbers.q) - dsa_cdata.g = self._int_to_bn(parameter_numbers.g) - dsa_cdata.pub_key = self._int_to_bn(numbers.public_numbers.y) - dsa_cdata.priv_key = self._int_to_bn(numbers.x) - - return _DSAPrivateKey(self, dsa_cdata) - - def load_dsa_public_numbers(self, numbers): - dsa._check_dsa_parameters(numbers.parameter_numbers) - dsa_cdata = self._lib.DSA_new() - assert dsa_cdata != self._ffi.NULL - dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) - - dsa_cdata.p = self._int_to_bn(numbers.parameter_numbers.p) - dsa_cdata.q = self._int_to_bn(numbers.parameter_numbers.q) - dsa_cdata.g = self._int_to_bn(numbers.parameter_numbers.g) - dsa_cdata.pub_key = self._int_to_bn(numbers.y) - - return _DSAPublicKey(self, dsa_cdata) - - def load_dsa_parameter_numbers(self, numbers): - dsa._check_dsa_parameters(numbers) - dsa_cdata = self._lib.DSA_new() - assert dsa_cdata != self._ffi.NULL - dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) - - dsa_cdata.p = self._int_to_bn(numbers.p) - dsa_cdata.q = self._int_to_bn(numbers.q) - dsa_cdata.g = self._int_to_bn(numbers.g) - - return _DSAParameters(self, dsa_cdata) - - def _dsa_cdata_from_public_key(self, public_key): - ctx = self._lib.DSA_new() - assert ctx != self._ffi.NULL - ctx = self._ffi.gc(ctx, self._lib.DSA_free) - parameters = public_key.parameters() - ctx.p = self._int_to_bn(parameters.p) - ctx.q = self._int_to_bn(parameters.q) - ctx.g = self._int_to_bn(parameters.g) - ctx.pub_key = self._int_to_bn(public_key.y) - return ctx - - def _dsa_cdata_from_private_key(self, private_key): - ctx = self._lib.DSA_new() - assert ctx != self._ffi.NULL - ctx = self._ffi.gc(ctx, self._lib.DSA_free) - parameters = private_key.parameters() - ctx.p = self._int_to_bn(parameters.p) - ctx.q = self._int_to_bn(parameters.q) - ctx.g = self._int_to_bn(parameters.g) - ctx.priv_key = self._int_to_bn(private_key.x) - ctx.pub_key = self._int_to_bn(private_key.y) - return ctx - - def dsa_hash_supported(self, algorithm): - if self._lib.OPENSSL_VERSION_NUMBER < 0x1000000f: - return isinstance(algorithm, hashes.SHA1) - else: - return self.hash_supported(algorithm) - - def dsa_parameters_supported(self, p, q, g): - if self._lib.OPENSSL_VERSION_NUMBER < 0x1000000f: - return (utils.bit_length(p) <= 1024 and utils.bit_length(q) <= 160) - else: - return True - - def decrypt_rsa(self, private_key, ciphertext, padding): - warnings.warn( - "decrypt_rsa is deprecated and will be removed in a future " - "version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - rsa_cdata = self._rsa_cdata_from_private_key(private_key) - key = _RSAPrivateKey(self, rsa_cdata) - return key.decrypt(ciphertext, padding) - - def encrypt_rsa(self, public_key, plaintext, padding): - warnings.warn( - "encrypt_rsa is deprecated and will be removed in a future " - "version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - rsa_cdata = self._rsa_cdata_from_public_key(public_key) - key = _RSAPublicKey(self, rsa_cdata) - return key.encrypt(plaintext, padding) - - def cmac_algorithm_supported(self, algorithm): - return ( - self._lib.Cryptography_HAS_CMAC == 1 - and self.cipher_supported(algorithm, CBC( - b"\x00" * algorithm.block_size)) - ) - - def create_cmac_ctx(self, algorithm): - return _CMACContext(self, algorithm) - - def load_pem_private_key(self, data, password): - return self._load_key( - self._lib.PEM_read_bio_PrivateKey, - self._evp_pkey_to_private_key, - data, - password, - ) - - def load_pem_public_key(self, data): - return self._load_key( - self._lib.PEM_read_bio_PUBKEY, - self._evp_pkey_to_public_key, - data, - None, - ) - - def load_traditional_openssl_pem_private_key(self, data, password): - warnings.warn( - "load_traditional_openssl_pem_private_key is deprecated and will " - "be removed in a future version, use load_pem_private_key " - "instead.", - utils.DeprecatedIn06, - stacklevel=2 - ) - return self.load_pem_private_key(data, password) - - def load_pkcs8_pem_private_key(self, data, password): - warnings.warn( - "load_pkcs8_pem_private_key is deprecated and will be removed in a" - " future version, use load_pem_private_key instead.", - utils.DeprecatedIn06, - stacklevel=2 - ) - return self.load_pem_private_key(data, password) - - def _load_key(self, openssl_read_func, convert_func, data, password): - mem_bio = self._bytes_to_bio(data) - - password_callback, password_func = self._pem_password_cb(password) - - evp_pkey = openssl_read_func( - mem_bio.bio, - self._ffi.NULL, - password_callback, - self._ffi.NULL - ) - - if evp_pkey == self._ffi.NULL: - if password_func.exception is not None: - errors = self._consume_errors() - assert errors - raise password_func.exception - else: - self._handle_key_loading_error() - - evp_pkey = self._ffi.gc(evp_pkey, self._lib.EVP_PKEY_free) - - if password is not None and password_func.called == 0: - raise TypeError( - "Password was given but private key is not encrypted.") - - assert ( - (password is not None and password_func.called == 1) or - password is None - ) - - return convert_func(evp_pkey) - - def _handle_key_loading_error(self): - errors = self._consume_errors() - - if not errors: - raise ValueError("Could not unserialize key data.") - - elif errors[0][1:] == ( - self._lib.ERR_LIB_EVP, - self._lib.EVP_F_EVP_DECRYPTFINAL_EX, - self._lib.EVP_R_BAD_DECRYPT - ): - raise ValueError("Bad decrypt. Incorrect password?") - - elif errors[0][1:] in ( - ( - self._lib.ERR_LIB_PEM, - self._lib.PEM_F_PEM_GET_EVP_CIPHER_INFO, - self._lib.PEM_R_UNSUPPORTED_ENCRYPTION - ), - - ( - self._lib.ERR_LIB_EVP, - self._lib.EVP_F_EVP_PBE_CIPHERINIT, - self._lib.EVP_R_UNKNOWN_PBE_ALGORITHM - ) - ): - raise UnsupportedAlgorithm( - "PEM data is encrypted with an unsupported cipher", - _Reasons.UNSUPPORTED_CIPHER - ) - - elif any( - error[1:] == ( - self._lib.ERR_LIB_EVP, - self._lib.EVP_F_EVP_PKCS82PKEY, - self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM - ) - for error in errors - ): - raise UnsupportedAlgorithm( - "Unsupported public key algorithm.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM - ) - - else: - assert errors[0][1] in ( - self._lib.ERR_LIB_EVP, - self._lib.ERR_LIB_PEM, - self._lib.ERR_LIB_ASN1, - ) - raise ValueError("Could not unserialize key data.") - - def elliptic_curve_supported(self, curve): - if self._lib.Cryptography_HAS_EC != 1: - return False - - try: - curve_nid = self._elliptic_curve_to_nid(curve) - except UnsupportedAlgorithm: - curve_nid = self._lib.NID_undef - - ctx = self._lib.EC_GROUP_new_by_curve_name(curve_nid) - - if ctx == self._ffi.NULL: - errors = self._consume_errors() - assert ( - curve_nid == self._lib.NID_undef or - errors[0][1:] == ( - self._lib.ERR_LIB_EC, - self._lib.EC_F_EC_GROUP_NEW_BY_CURVE_NAME, - self._lib.EC_R_UNKNOWN_GROUP - ) - ) - return False - else: - assert curve_nid != self._lib.NID_undef - self._lib.EC_GROUP_free(ctx) - return True - - def elliptic_curve_signature_algorithm_supported( - self, signature_algorithm, curve - ): - if self._lib.Cryptography_HAS_EC != 1: - return False - - # We only support ECDSA right now. - if not isinstance(signature_algorithm, ec.ECDSA): - return False - - # Before 0.9.8m OpenSSL can't cope with digests longer than the curve. - if ( - self._lib.OPENSSL_VERSION_NUMBER < 0x009080df and - curve.key_size < signature_algorithm.algorithm.digest_size * 8 - ): - return False - - return self.elliptic_curve_supported(curve) - - def generate_elliptic_curve_private_key(self, curve): - """ - Generate a new private key on the named curve. - """ - - if self.elliptic_curve_supported(curve): - curve_nid = self._elliptic_curve_to_nid(curve) - - ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid) - assert ec_cdata != self._ffi.NULL - ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) - - res = self._lib.EC_KEY_generate_key(ec_cdata) - assert res == 1 - - res = self._lib.EC_KEY_check_key(ec_cdata) - assert res == 1 - - return _EllipticCurvePrivateKey(self, ec_cdata) - else: - raise UnsupportedAlgorithm( - "Backend object does not support {0}.".format(curve.name), - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - def elliptic_curve_private_key_from_numbers(self, numbers): - warnings.warn( - "elliptic_curve_private_key_from_numbers is deprecated and will " - "be removed in a future version.", - utils.DeprecatedIn06, - stacklevel=2 - ) - return self.load_elliptic_curve_private_numbers(numbers) - - def load_elliptic_curve_private_numbers(self, numbers): - public = numbers.public_numbers - - curve_nid = self._elliptic_curve_to_nid(public.curve) - - ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid) - assert ec_cdata != self._ffi.NULL - ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) - - ec_cdata = self._ec_key_set_public_key_affine_coordinates( - ec_cdata, public.x, public.y) - - res = self._lib.EC_KEY_set_private_key( - ec_cdata, self._int_to_bn(numbers.private_value)) - assert res == 1 - - return _EllipticCurvePrivateKey(self, ec_cdata) - - def elliptic_curve_public_key_from_numbers(self, numbers): - warnings.warn( - "elliptic_curve_public_key_from_numbers is deprecated and will be " - "removed in a future version.", - utils.DeprecatedIn06, - stacklevel=2 - ) - return self.load_elliptic_curve_public_numbers(numbers) - - def load_elliptic_curve_public_numbers(self, numbers): - curve_nid = self._elliptic_curve_to_nid(numbers.curve) - - ec_cdata = self._lib.EC_KEY_new_by_curve_name(curve_nid) - assert ec_cdata != self._ffi.NULL - ec_cdata = self._ffi.gc(ec_cdata, self._lib.EC_KEY_free) - - ec_cdata = self._ec_key_set_public_key_affine_coordinates( - ec_cdata, numbers.x, numbers.y) - - return _EllipticCurvePublicKey(self, ec_cdata) - - def _elliptic_curve_to_nid(self, curve): - """ - Get the NID for a curve name. - """ - - curve_aliases = { - "secp192r1": "prime192v1", - "secp256r1": "prime256v1" - } - - curve_name = curve_aliases.get(curve.name, curve.name) - - curve_nid = self._lib.OBJ_sn2nid(curve_name.encode()) - if curve_nid == self._lib.NID_undef: - raise UnsupportedAlgorithm( - "{0} is not a supported elliptic curve".format(curve.name), - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - return curve_nid - - @contextmanager - def _tmp_bn_ctx(self): - bn_ctx = self._lib.BN_CTX_new() - assert bn_ctx != self._ffi.NULL - bn_ctx = self._ffi.gc(bn_ctx, self._lib.BN_CTX_free) - self._lib.BN_CTX_start(bn_ctx) - try: - yield bn_ctx - finally: - self._lib.BN_CTX_end(bn_ctx) - - def _ec_key_determine_group_get_set_funcs(self, ctx): - """ - Given an EC_KEY determine the group and what methods are required to - get/set point coordinates. - """ - assert ctx != self._ffi.NULL - - nid_two_field = self._lib.OBJ_sn2nid(b"characteristic-two-field") - assert nid_two_field != self._lib.NID_undef - - group = self._lib.EC_KEY_get0_group(ctx) - assert group != self._ffi.NULL - - method = self._lib.EC_GROUP_method_of(group) - assert method != self._ffi.NULL - - nid = self._lib.EC_METHOD_get_field_type(method) - assert nid != self._lib.NID_undef - - if nid == nid_two_field and self._lib.Cryptography_HAS_EC2M: - set_func = self._lib.EC_POINT_set_affine_coordinates_GF2m - get_func = self._lib.EC_POINT_get_affine_coordinates_GF2m - else: - set_func = self._lib.EC_POINT_set_affine_coordinates_GFp - get_func = self._lib.EC_POINT_get_affine_coordinates_GFp - - assert set_func and get_func - - return set_func, get_func, group - - def _ec_key_set_public_key_affine_coordinates(self, ctx, x, y): - """ - This is a port of EC_KEY_set_public_key_affine_coordinates that was - added in 1.0.1. - - Sets the public key point in the EC_KEY context to the affine x and y - values. - """ - - bn_x = self._int_to_bn(x) - bn_y = self._int_to_bn(y) - - set_func, get_func, group = ( - self._ec_key_determine_group_get_set_funcs(ctx) - ) - - point = self._lib.EC_POINT_new(group) - assert point != self._ffi.NULL - point = self._ffi.gc(point, self._lib.EC_POINT_free) - - with self._tmp_bn_ctx() as bn_ctx: - check_x = self._lib.BN_CTX_get(bn_ctx) - check_y = self._lib.BN_CTX_get(bn_ctx) - - res = set_func(group, point, bn_x, bn_y, bn_ctx) - assert res == 1 - - res = get_func(group, point, check_x, check_y, bn_ctx) - assert res == 1 - - assert ( - self._lib.BN_cmp(bn_x, check_x) == 0 and - self._lib.BN_cmp(bn_y, check_y) == 0 - ) - - res = self._lib.EC_KEY_set_public_key(ctx, point) - assert res == 1 - - res = self._lib.EC_KEY_check_key(ctx) - assert res == 1 - - return ctx - - -class GetCipherByName(object): - def __init__(self, fmt): - self._fmt = fmt - - def __call__(self, backend, cipher, mode): - cipher_name = self._fmt.format(cipher=cipher, mode=mode).lower() - return backend._lib.EVP_get_cipherbyname(cipher_name.encode("ascii")) - - -backend = Backend() diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ciphers.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ciphers.py deleted file mode 100644 index d37bb01..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ciphers.py +++ /dev/null @@ -1,227 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import InvalidTag, UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.primitives import interfaces -from cryptography.hazmat.primitives.ciphers.modes import GCM - - -@utils.register_interface(interfaces.CipherContext) -@utils.register_interface(interfaces.AEADCipherContext) -@utils.register_interface(interfaces.AEADEncryptionContext) -class _CipherContext(object): - _ENCRYPT = 1 - _DECRYPT = 0 - - def __init__(self, backend, cipher, mode, operation): - self._backend = backend - self._cipher = cipher - self._mode = mode - self._operation = operation - self._tag = None - - if isinstance(self._cipher, interfaces.BlockCipherAlgorithm): - self._block_size = self._cipher.block_size - else: - self._block_size = 1 - - ctx = self._backend._lib.EVP_CIPHER_CTX_new() - ctx = self._backend._ffi.gc( - ctx, self._backend._lib.EVP_CIPHER_CTX_free - ) - - registry = self._backend._cipher_registry - try: - adapter = registry[type(cipher), type(mode)] - except KeyError: - raise UnsupportedAlgorithm( - "cipher {0} in {1} mode is not supported " - "by this backend.".format( - cipher.name, mode.name if mode else mode), - _Reasons.UNSUPPORTED_CIPHER - ) - - evp_cipher = adapter(self._backend, cipher, mode) - if evp_cipher == self._backend._ffi.NULL: - raise UnsupportedAlgorithm( - "cipher {0} in {1} mode is not supported " - "by this backend.".format( - cipher.name, mode.name if mode else mode), - _Reasons.UNSUPPORTED_CIPHER - ) - - if isinstance(mode, interfaces.ModeWithInitializationVector): - iv_nonce = mode.initialization_vector - elif isinstance(mode, interfaces.ModeWithNonce): - iv_nonce = mode.nonce - else: - iv_nonce = self._backend._ffi.NULL - # begin init with cipher and operation type - res = self._backend._lib.EVP_CipherInit_ex(ctx, evp_cipher, - self._backend._ffi.NULL, - self._backend._ffi.NULL, - self._backend._ffi.NULL, - operation) - assert res != 0 - # set the key length to handle variable key ciphers - res = self._backend._lib.EVP_CIPHER_CTX_set_key_length( - ctx, len(cipher.key) - ) - assert res != 0 - if isinstance(mode, GCM): - res = self._backend._lib.EVP_CIPHER_CTX_ctrl( - ctx, self._backend._lib.EVP_CTRL_GCM_SET_IVLEN, - len(iv_nonce), self._backend._ffi.NULL - ) - assert res != 0 - if operation == self._DECRYPT: - res = self._backend._lib.EVP_CIPHER_CTX_ctrl( - ctx, self._backend._lib.EVP_CTRL_GCM_SET_TAG, - len(mode.tag), mode.tag - ) - assert res != 0 - - # pass key/iv - res = self._backend._lib.EVP_CipherInit_ex( - ctx, - self._backend._ffi.NULL, - self._backend._ffi.NULL, - cipher.key, - iv_nonce, - operation - ) - assert res != 0 - # We purposely disable padding here as it's handled higher up in the - # API. - self._backend._lib.EVP_CIPHER_CTX_set_padding(ctx, 0) - self._ctx = ctx - - def update(self, data): - # OpenSSL 0.9.8e has an assertion in its EVP code that causes it - # to SIGABRT if you call update with an empty byte string. This can be - # removed when we drop support for 0.9.8e (CentOS/RHEL 5). This branch - # should be taken only when length is zero and mode is not GCM because - # AES GCM can return improper tag values if you don't call update - # with empty plaintext when authenticating AAD for ...reasons. - if len(data) == 0 and not isinstance(self._mode, GCM): - return b"" - - buf = self._backend._ffi.new("unsigned char[]", - len(data) + self._block_size - 1) - outlen = self._backend._ffi.new("int *") - res = self._backend._lib.EVP_CipherUpdate(self._ctx, buf, outlen, data, - len(data)) - assert res != 0 - return self._backend._ffi.buffer(buf)[:outlen[0]] - - def finalize(self): - # OpenSSL 1.0.1 on Ubuntu 12.04 (and possibly other distributions) - # appears to have a bug where you must make at least one call to update - # even if you are only using authenticate_additional_data or the - # GCM tag will be wrong. An (empty) call to update resolves this - # and is harmless for all other versions of OpenSSL. - if isinstance(self._mode, GCM): - self.update(b"") - - buf = self._backend._ffi.new("unsigned char[]", self._block_size) - outlen = self._backend._ffi.new("int *") - res = self._backend._lib.EVP_CipherFinal_ex(self._ctx, buf, outlen) - if res == 0: - errors = self._backend._consume_errors() - - if not errors and isinstance(self._mode, GCM): - raise InvalidTag - - assert errors - - if errors[0][1:] == ( - self._backend._lib.ERR_LIB_EVP, - self._backend._lib.EVP_F_EVP_ENCRYPTFINAL_EX, - self._backend._lib.EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH - ) or errors[0][1:] == ( - self._backend._lib.ERR_LIB_EVP, - self._backend._lib.EVP_F_EVP_DECRYPTFINAL_EX, - self._backend._lib.EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH - ): - raise ValueError( - "The length of the provided data is not a multiple of " - "the block length." - ) - else: - raise self._backend._unknown_error(errors[0]) - - if (isinstance(self._mode, GCM) and - self._operation == self._ENCRYPT): - block_byte_size = self._block_size // 8 - tag_buf = self._backend._ffi.new( - "unsigned char[]", block_byte_size - ) - res = self._backend._lib.EVP_CIPHER_CTX_ctrl( - self._ctx, self._backend._lib.EVP_CTRL_GCM_GET_TAG, - block_byte_size, tag_buf - ) - assert res != 0 - self._tag = self._backend._ffi.buffer(tag_buf)[:] - - res = self._backend._lib.EVP_CIPHER_CTX_cleanup(self._ctx) - assert res == 1 - return self._backend._ffi.buffer(buf)[:outlen[0]] - - def authenticate_additional_data(self, data): - outlen = self._backend._ffi.new("int *") - res = self._backend._lib.EVP_CipherUpdate( - self._ctx, self._backend._ffi.NULL, outlen, data, len(data) - ) - assert res != 0 - - @property - def tag(self): - return self._tag - - -@utils.register_interface(interfaces.CipherContext) -class _AESCTRCipherContext(object): - """ - This is needed to provide support for AES CTR mode in OpenSSL 0.9.8. It can - be removed when we drop 0.9.8 support (RHEL5 extended life ends 2020). - """ - def __init__(self, backend, cipher, mode): - self._backend = backend - - self._key = self._backend._ffi.new("AES_KEY *") - assert self._key != self._backend._ffi.NULL - res = self._backend._lib.AES_set_encrypt_key( - cipher.key, len(cipher.key) * 8, self._key - ) - assert res == 0 - self._ecount = self._backend._ffi.new("char[]", 16) - self._nonce = self._backend._ffi.new("char[16]", mode.nonce) - self._num = self._backend._ffi.new("unsigned int *", 0) - - def update(self, data): - buf = self._backend._ffi.new("unsigned char[]", len(data)) - self._backend._lib.AES_ctr128_encrypt( - data, buf, len(data), self._key, self._nonce, - self._ecount, self._num - ) - return self._backend._ffi.buffer(buf)[:] - - def finalize(self): - self._key = None - self._ecount = None - self._nonce = None - self._num = None - return b"" diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/cmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/cmac.py deleted file mode 100644 index 7acf439..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/cmac.py +++ /dev/null @@ -1,80 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.primitives import interfaces -from cryptography.hazmat.primitives.ciphers.modes import CBC - - -@utils.register_interface(interfaces.CMACContext) -class _CMACContext(object): - def __init__(self, backend, algorithm, ctx=None): - if not backend.cmac_algorithm_supported(algorithm): - raise UnsupportedAlgorithm("This backend does not support CMAC.", - _Reasons.UNSUPPORTED_CIPHER) - - self._backend = backend - self._key = algorithm.key - self._algorithm = algorithm - self._output_length = algorithm.block_size // 8 - - if ctx is None: - registry = self._backend._cipher_registry - adapter = registry[type(algorithm), CBC] - - evp_cipher = adapter(self._backend, algorithm, CBC) - - ctx = self._backend._lib.CMAC_CTX_new() - - assert ctx != self._backend._ffi.NULL - ctx = self._backend._ffi.gc(ctx, self._backend._lib.CMAC_CTX_free) - - self._backend._lib.CMAC_Init( - ctx, self._key, len(self._key), - evp_cipher, self._backend._ffi.NULL - ) - - self._ctx = ctx - - def update(self, data): - res = self._backend._lib.CMAC_Update(self._ctx, data, len(data)) - assert res == 1 - - def finalize(self): - buf = self._backend._ffi.new("unsigned char[]", self._output_length) - length = self._backend._ffi.new("size_t *", self._output_length) - res = self._backend._lib.CMAC_Final( - self._ctx, buf, length - ) - assert res == 1 - - self._ctx = None - - return self._backend._ffi.buffer(buf)[:] - - def copy(self): - copied_ctx = self._backend._lib.CMAC_CTX_new() - copied_ctx = self._backend._ffi.gc( - copied_ctx, self._backend._lib.CMAC_CTX_free - ) - res = self._backend._lib.CMAC_CTX_copy( - copied_ctx, self._ctx - ) - assert res == 1 - return _CMACContext( - self._backend, self._algorithm, ctx=copied_ctx - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/dsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/dsa.py deleted file mode 100644 index 5e7a26f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/dsa.py +++ /dev/null @@ -1,190 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import InvalidSignature -from cryptography.hazmat.primitives import hashes, interfaces -from cryptography.hazmat.primitives.asymmetric import dsa -from cryptography.hazmat.primitives.interfaces import ( - DSAParametersWithNumbers, DSAPrivateKeyWithNumbers, DSAPublicKeyWithNumbers -) - - -@utils.register_interface(interfaces.AsymmetricVerificationContext) -class _DSAVerificationContext(object): - def __init__(self, backend, public_key, signature, algorithm): - self._backend = backend - self._public_key = public_key - self._signature = signature - self._algorithm = algorithm - - self._hash_ctx = hashes.Hash(self._algorithm, self._backend) - - def update(self, data): - self._hash_ctx.update(data) - - def verify(self): - self._dsa_cdata = self._backend._ffi.gc(self._public_key._dsa_cdata, - self._backend._lib.DSA_free) - - data_to_verify = self._hash_ctx.finalize() - - # The first parameter passed to DSA_verify is unused by OpenSSL but - # must be an integer. - res = self._backend._lib.DSA_verify( - 0, data_to_verify, len(data_to_verify), self._signature, - len(self._signature), self._public_key._dsa_cdata) - - if res != 1: - errors = self._backend._consume_errors() - assert errors - if res == -1: - assert errors[0].lib == self._backend._lib.ERR_LIB_ASN1 - - raise InvalidSignature - - -@utils.register_interface(interfaces.AsymmetricSignatureContext) -class _DSASignatureContext(object): - def __init__(self, backend, private_key, algorithm): - self._backend = backend - self._private_key = private_key - self._algorithm = algorithm - self._hash_ctx = hashes.Hash(self._algorithm, self._backend) - - def update(self, data): - self._hash_ctx.update(data) - - def finalize(self): - data_to_sign = self._hash_ctx.finalize() - sig_buf_len = self._backend._lib.DSA_size(self._private_key._dsa_cdata) - sig_buf = self._backend._ffi.new("unsigned char[]", sig_buf_len) - buflen = self._backend._ffi.new("unsigned int *") - - # The first parameter passed to DSA_sign is unused by OpenSSL but - # must be an integer. - res = self._backend._lib.DSA_sign( - 0, data_to_sign, len(data_to_sign), sig_buf, - buflen, self._private_key._dsa_cdata) - assert res == 1 - assert buflen[0] - - return self._backend._ffi.buffer(sig_buf)[:buflen[0]] - - -@utils.register_interface(DSAParametersWithNumbers) -class _DSAParameters(object): - def __init__(self, backend, dsa_cdata): - self._backend = backend - self._dsa_cdata = dsa_cdata - - def parameter_numbers(self): - return dsa.DSAParameterNumbers( - p=self._backend._bn_to_int(self._dsa_cdata.p), - q=self._backend._bn_to_int(self._dsa_cdata.q), - g=self._backend._bn_to_int(self._dsa_cdata.g) - ) - - def generate_private_key(self): - return self._backend.generate_dsa_private_key(self) - - -@utils.register_interface(DSAPrivateKeyWithNumbers) -class _DSAPrivateKey(object): - def __init__(self, backend, dsa_cdata): - self._backend = backend - self._dsa_cdata = dsa_cdata - self._key_size = self._backend._lib.BN_num_bits(self._dsa_cdata.p) - - @property - def key_size(self): - return self._key_size - - def signer(self, algorithm): - return _DSASignatureContext(self._backend, self, algorithm) - - def private_numbers(self): - return dsa.DSAPrivateNumbers( - public_numbers=dsa.DSAPublicNumbers( - parameter_numbers=dsa.DSAParameterNumbers( - p=self._backend._bn_to_int(self._dsa_cdata.p), - q=self._backend._bn_to_int(self._dsa_cdata.q), - g=self._backend._bn_to_int(self._dsa_cdata.g) - ), - y=self._backend._bn_to_int(self._dsa_cdata.pub_key) - ), - x=self._backend._bn_to_int(self._dsa_cdata.priv_key) - ) - - def public_key(self): - dsa_cdata = self._backend._lib.DSA_new() - assert dsa_cdata != self._backend._ffi.NULL - dsa_cdata = self._backend._ffi.gc( - dsa_cdata, self._backend._lib.DSA_free - ) - dsa_cdata.p = self._backend._lib.BN_dup(self._dsa_cdata.p) - dsa_cdata.q = self._backend._lib.BN_dup(self._dsa_cdata.q) - dsa_cdata.g = self._backend._lib.BN_dup(self._dsa_cdata.g) - dsa_cdata.pub_key = self._backend._lib.BN_dup(self._dsa_cdata.pub_key) - return _DSAPublicKey(self._backend, dsa_cdata) - - def parameters(self): - dsa_cdata = self._backend._lib.DSA_new() - assert dsa_cdata != self._backend._ffi.NULL - dsa_cdata = self._backend._ffi.gc( - dsa_cdata, self._backend._lib.DSA_free - ) - dsa_cdata.p = self._backend._lib.BN_dup(self._dsa_cdata.p) - dsa_cdata.q = self._backend._lib.BN_dup(self._dsa_cdata.q) - dsa_cdata.g = self._backend._lib.BN_dup(self._dsa_cdata.g) - return _DSAParameters(self._backend, dsa_cdata) - - -@utils.register_interface(DSAPublicKeyWithNumbers) -class _DSAPublicKey(object): - def __init__(self, backend, dsa_cdata): - self._backend = backend - self._dsa_cdata = dsa_cdata - self._key_size = self._backend._lib.BN_num_bits(self._dsa_cdata.p) - - @property - def key_size(self): - return self._key_size - - def verifier(self, signature, algorithm): - return _DSAVerificationContext( - self._backend, self, signature, algorithm - ) - - def public_numbers(self): - return dsa.DSAPublicNumbers( - parameter_numbers=dsa.DSAParameterNumbers( - p=self._backend._bn_to_int(self._dsa_cdata.p), - q=self._backend._bn_to_int(self._dsa_cdata.q), - g=self._backend._bn_to_int(self._dsa_cdata.g) - ), - y=self._backend._bn_to_int(self._dsa_cdata.pub_key) - ) - - def parameters(self): - dsa_cdata = self._backend._lib.DSA_new() - assert dsa_cdata != self._backend._ffi.NULL - dsa_cdata = self._backend._ffi.gc( - dsa_cdata, self._backend._lib.DSA_free - ) - dsa_cdata.p = self._backend._lib.BN_dup(self._dsa_cdata.p) - dsa_cdata.q = self._backend._lib.BN_dup(self._dsa_cdata.q) - dsa_cdata.g = self._backend._lib.BN_dup(self._dsa_cdata.g) - return _DSAParameters(self._backend, dsa_cdata) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ec.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ec.py deleted file mode 100644 index 9371a9a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/ec.py +++ /dev/null @@ -1,254 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import six - -from cryptography import utils -from cryptography.exceptions import ( - InvalidSignature, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.primitives import hashes, interfaces -from cryptography.hazmat.primitives.asymmetric import ec - - -def _truncate_digest_for_ecdsa(ec_key_cdata, digest, backend): - """ - This function truncates digests that are longer than a given elliptic - curve key's length so they can be signed. Since elliptic curve keys are - much shorter than RSA keys many digests (e.g. SHA-512) may require - truncation. - """ - - _lib = backend._lib - _ffi = backend._ffi - - digest_len = len(digest) - - group = _lib.EC_KEY_get0_group(ec_key_cdata) - - with backend._tmp_bn_ctx() as bn_ctx: - order = _lib.BN_CTX_get(bn_ctx) - assert order != _ffi.NULL - - res = _lib.EC_GROUP_get_order(group, order, bn_ctx) - assert res == 1 - - order_bits = _lib.BN_num_bits(order) - - if 8 * digest_len > order_bits: - digest_len = (order_bits + 7) // 8 - digest = digest[:digest_len] - - if 8 * digest_len > order_bits: - rshift = 8 - (order_bits & 0x7) - assert rshift > 0 and rshift < 8 - - mask = 0xFF >> rshift << rshift - - # Set the bottom rshift bits to 0 - digest = digest[:-1] + six.int2byte(six.indexbytes(digest, -1) & mask) - - return digest - - -def _ec_key_curve_sn(backend, ec_key): - group = backend._lib.EC_KEY_get0_group(ec_key) - assert group != backend._ffi.NULL - - nid = backend._lib.EC_GROUP_get_curve_name(group) - assert nid != backend._lib.NID_undef - - curve_name = backend._lib.OBJ_nid2sn(nid) - assert curve_name != backend._ffi.NULL - - sn = backend._ffi.string(curve_name).decode('ascii') - return sn - - -def _sn_to_elliptic_curve(backend, sn): - try: - return ec._CURVE_TYPES[sn]() - except KeyError: - raise UnsupportedAlgorithm( - "{0} is not a supported elliptic curve".format(sn), - _Reasons.UNSUPPORTED_ELLIPTIC_CURVE - ) - - -@utils.register_interface(interfaces.AsymmetricSignatureContext) -class _ECDSASignatureContext(object): - def __init__(self, backend, private_key, algorithm): - self._backend = backend - self._private_key = private_key - self._digest = hashes.Hash(algorithm, backend) - - def update(self, data): - self._digest.update(data) - - def finalize(self): - ec_key = self._private_key._ec_key - - digest = self._digest.finalize() - - digest = _truncate_digest_for_ecdsa(ec_key, digest, self._backend) - - max_size = self._backend._lib.ECDSA_size(ec_key) - assert max_size > 0 - - sigbuf = self._backend._ffi.new("char[]", max_size) - siglen_ptr = self._backend._ffi.new("unsigned int[]", 1) - res = self._backend._lib.ECDSA_sign( - 0, - digest, - len(digest), - sigbuf, - siglen_ptr, - ec_key - ) - assert res == 1 - return self._backend._ffi.buffer(sigbuf)[:siglen_ptr[0]] - - -@utils.register_interface(interfaces.AsymmetricVerificationContext) -class _ECDSAVerificationContext(object): - def __init__(self, backend, public_key, signature, algorithm): - self._backend = backend - self._public_key = public_key - self._signature = signature - self._digest = hashes.Hash(algorithm, backend) - - def update(self, data): - self._digest.update(data) - - def verify(self): - ec_key = self._public_key._ec_key - - digest = self._digest.finalize() - - digest = _truncate_digest_for_ecdsa(ec_key, digest, self._backend) - - res = self._backend._lib.ECDSA_verify( - 0, - digest, - len(digest), - self._signature, - len(self._signature), - ec_key - ) - if res != 1: - self._backend._consume_errors() - raise InvalidSignature - return True - - -@utils.register_interface(interfaces.EllipticCurvePrivateKeyWithNumbers) -class _EllipticCurvePrivateKey(object): - def __init__(self, backend, ec_key_cdata): - self._backend = backend - self._ec_key = ec_key_cdata - - sn = _ec_key_curve_sn(backend, ec_key_cdata) - self._curve = _sn_to_elliptic_curve(backend, sn) - - @property - def curve(self): - return self._curve - - def signer(self, signature_algorithm): - if isinstance(signature_algorithm, ec.ECDSA): - return _ECDSASignatureContext( - self._backend, self, signature_algorithm.algorithm - ) - else: - raise UnsupportedAlgorithm( - "Unsupported elliptic curve signature algorithm.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def public_key(self): - group = self._backend._lib.EC_KEY_get0_group(self._ec_key) - assert group != self._backend._ffi.NULL - - curve_nid = self._backend._lib.EC_GROUP_get_curve_name(group) - - public_ec_key = self._backend._lib.EC_KEY_new_by_curve_name(curve_nid) - assert public_ec_key != self._backend._ffi.NULL - public_ec_key = self._backend._ffi.gc( - public_ec_key, self._backend._lib.EC_KEY_free - ) - - point = self._backend._lib.EC_KEY_get0_public_key(self._ec_key) - assert point != self._backend._ffi.NULL - - res = self._backend._lib.EC_KEY_set_public_key(public_ec_key, point) - assert res == 1 - - return _EllipticCurvePublicKey( - self._backend, public_ec_key - ) - - def private_numbers(self): - bn = self._backend._lib.EC_KEY_get0_private_key(self._ec_key) - private_value = self._backend._bn_to_int(bn) - return ec.EllipticCurvePrivateNumbers( - private_value=private_value, - public_numbers=self.public_key().public_numbers() - ) - - -@utils.register_interface(interfaces.EllipticCurvePublicKeyWithNumbers) -class _EllipticCurvePublicKey(object): - def __init__(self, backend, ec_key_cdata): - self._backend = backend - self._ec_key = ec_key_cdata - - sn = _ec_key_curve_sn(backend, ec_key_cdata) - self._curve = _sn_to_elliptic_curve(backend, sn) - - @property - def curve(self): - return self._curve - - def verifier(self, signature, signature_algorithm): - if isinstance(signature_algorithm, ec.ECDSA): - return _ECDSAVerificationContext( - self._backend, self, signature, signature_algorithm.algorithm - ) - else: - raise UnsupportedAlgorithm( - "Unsupported elliptic curve signature algorithm.", - _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) - - def public_numbers(self): - set_func, get_func, group = ( - self._backend._ec_key_determine_group_get_set_funcs(self._ec_key) - ) - point = self._backend._lib.EC_KEY_get0_public_key(self._ec_key) - assert point != self._backend._ffi.NULL - - with self._backend._tmp_bn_ctx() as bn_ctx: - bn_x = self._backend._lib.BN_CTX_get(bn_ctx) - bn_y = self._backend._lib.BN_CTX_get(bn_ctx) - - res = get_func(group, point, bn_x, bn_y, bn_ctx) - assert res == 1 - - x = self._backend._bn_to_int(bn_x) - y = self._backend._bn_to_int(bn_y) - - return ec.EllipticCurvePublicNumbers( - x=x, - y=y, - curve=self._curve - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hashes.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hashes.py deleted file mode 100644 index da91eef..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hashes.py +++ /dev/null @@ -1,69 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.HashContext) -class _HashContext(object): - def __init__(self, backend, algorithm, ctx=None): - self.algorithm = algorithm - - self._backend = backend - - if ctx is None: - ctx = self._backend._lib.EVP_MD_CTX_create() - ctx = self._backend._ffi.gc(ctx, - self._backend._lib.EVP_MD_CTX_destroy) - evp_md = self._backend._lib.EVP_get_digestbyname( - algorithm.name.encode("ascii")) - if evp_md == self._backend._ffi.NULL: - raise UnsupportedAlgorithm( - "{0} is not a supported hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - res = self._backend._lib.EVP_DigestInit_ex(ctx, evp_md, - self._backend._ffi.NULL) - assert res != 0 - - self._ctx = ctx - - def copy(self): - copied_ctx = self._backend._lib.EVP_MD_CTX_create() - copied_ctx = self._backend._ffi.gc( - copied_ctx, self._backend._lib.EVP_MD_CTX_destroy - ) - res = self._backend._lib.EVP_MD_CTX_copy_ex(copied_ctx, self._ctx) - assert res != 0 - return _HashContext(self._backend, self.algorithm, ctx=copied_ctx) - - def update(self, data): - res = self._backend._lib.EVP_DigestUpdate(self._ctx, data, len(data)) - assert res != 0 - - def finalize(self): - buf = self._backend._ffi.new("unsigned char[]", - self._backend._lib.EVP_MAX_MD_SIZE) - outlen = self._backend._ffi.new("unsigned int *") - res = self._backend._lib.EVP_DigestFinal_ex(self._ctx, buf, outlen) - assert res != 0 - assert outlen[0] == self.algorithm.digest_size - res = self._backend._lib.EVP_MD_CTX_cleanup(self._ctx) - assert res == 1 - return self._backend._ffi.buffer(buf)[:outlen[0]] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hmac.py deleted file mode 100644 index 3f1576f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/hmac.py +++ /dev/null @@ -1,80 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.HashContext) -class _HMACContext(object): - def __init__(self, backend, key, algorithm, ctx=None): - self.algorithm = algorithm - self._backend = backend - - if ctx is None: - ctx = self._backend._ffi.new("HMAC_CTX *") - self._backend._lib.HMAC_CTX_init(ctx) - ctx = self._backend._ffi.gc( - ctx, self._backend._lib.HMAC_CTX_cleanup - ) - evp_md = self._backend._lib.EVP_get_digestbyname( - algorithm.name.encode('ascii')) - if evp_md == self._backend._ffi.NULL: - raise UnsupportedAlgorithm( - "{0} is not a supported hash on this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - res = self._backend._lib.Cryptography_HMAC_Init_ex( - ctx, key, len(key), evp_md, self._backend._ffi.NULL - ) - assert res != 0 - - self._ctx = ctx - self._key = key - - def copy(self): - copied_ctx = self._backend._ffi.new("HMAC_CTX *") - self._backend._lib.HMAC_CTX_init(copied_ctx) - copied_ctx = self._backend._ffi.gc( - copied_ctx, self._backend._lib.HMAC_CTX_cleanup - ) - res = self._backend._lib.Cryptography_HMAC_CTX_copy( - copied_ctx, self._ctx - ) - assert res != 0 - return _HMACContext( - self._backend, self._key, self.algorithm, ctx=copied_ctx - ) - - def update(self, data): - res = self._backend._lib.Cryptography_HMAC_Update( - self._ctx, data, len(data) - ) - assert res != 0 - - def finalize(self): - buf = self._backend._ffi.new("unsigned char[]", - self._backend._lib.EVP_MAX_MD_SIZE) - outlen = self._backend._ffi.new("unsigned int *") - res = self._backend._lib.Cryptography_HMAC_Final( - self._ctx, buf, outlen - ) - assert res != 0 - assert outlen[0] == self.algorithm.digest_size - self._backend._lib.HMAC_CTX_cleanup(self._ctx) - return self._backend._ffi.buffer(buf)[:outlen[0]] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/rsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/rsa.py deleted file mode 100644 index d24bea5..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/backends/openssl/rsa.py +++ /dev/null @@ -1,603 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import math - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, InvalidSignature, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.primitives import hashes, interfaces -from cryptography.hazmat.primitives.asymmetric import rsa -from cryptography.hazmat.primitives.asymmetric.padding import ( - MGF1, OAEP, PKCS1v15, PSS -) -from cryptography.hazmat.primitives.interfaces import ( - RSAPrivateKeyWithNumbers, RSAPublicKeyWithNumbers -) - - -def _get_rsa_pss_salt_length(pss, key_size, digest_size): - salt = pss._salt_length - - if salt is MGF1.MAX_LENGTH or salt is PSS.MAX_LENGTH: - # bit length - 1 per RFC 3447 - emlen = int(math.ceil((key_size - 1) / 8.0)) - salt_length = emlen - digest_size - 2 - assert salt_length >= 0 - return salt_length - else: - return salt - - -def _enc_dec_rsa(backend, key, data, padding): - if not isinstance(padding, interfaces.AsymmetricPadding): - raise TypeError("Padding must be an instance of AsymmetricPadding.") - - if isinstance(padding, PKCS1v15): - padding_enum = backend._lib.RSA_PKCS1_PADDING - elif isinstance(padding, OAEP): - padding_enum = backend._lib.RSA_PKCS1_OAEP_PADDING - if not isinstance(padding._mgf, MGF1): - raise UnsupportedAlgorithm( - "Only MGF1 is supported by this backend.", - _Reasons.UNSUPPORTED_MGF - ) - - if not isinstance(padding._mgf._algorithm, hashes.SHA1): - raise UnsupportedAlgorithm( - "This backend supports only SHA1 inside MGF1 when " - "using OAEP.", - _Reasons.UNSUPPORTED_HASH - ) - - if padding._label is not None and padding._label != b"": - raise ValueError("This backend does not support OAEP labels.") - - if not isinstance(padding._algorithm, hashes.SHA1): - raise UnsupportedAlgorithm( - "This backend only supports SHA1 when using OAEP.", - _Reasons.UNSUPPORTED_HASH - ) - else: - raise UnsupportedAlgorithm( - "{0} is not supported by this backend.".format( - padding.name - ), - _Reasons.UNSUPPORTED_PADDING - ) - - if backend._lib.Cryptography_HAS_PKEY_CTX: - return _enc_dec_rsa_pkey_ctx(backend, key, data, padding_enum) - else: - return _enc_dec_rsa_098(backend, key, data, padding_enum) - - -def _enc_dec_rsa_pkey_ctx(backend, key, data, padding_enum): - if isinstance(key, _RSAPublicKey): - init = backend._lib.EVP_PKEY_encrypt_init - crypt = backend._lib.Cryptography_EVP_PKEY_encrypt - else: - init = backend._lib.EVP_PKEY_decrypt_init - crypt = backend._lib.Cryptography_EVP_PKEY_decrypt - - pkey_ctx = backend._lib.EVP_PKEY_CTX_new( - key._evp_pkey, backend._ffi.NULL - ) - assert pkey_ctx != backend._ffi.NULL - pkey_ctx = backend._ffi.gc(pkey_ctx, backend._lib.EVP_PKEY_CTX_free) - res = init(pkey_ctx) - assert res == 1 - res = backend._lib.EVP_PKEY_CTX_set_rsa_padding( - pkey_ctx, padding_enum) - assert res > 0 - buf_size = backend._lib.EVP_PKEY_size(key._evp_pkey) - assert buf_size > 0 - outlen = backend._ffi.new("size_t *", buf_size) - buf = backend._ffi.new("char[]", buf_size) - res = crypt(pkey_ctx, buf, outlen, data, len(data)) - if res <= 0: - _handle_rsa_enc_dec_error(backend, key) - - return backend._ffi.buffer(buf)[:outlen[0]] - - -def _enc_dec_rsa_098(backend, key, data, padding_enum): - if isinstance(key, _RSAPublicKey): - crypt = backend._lib.RSA_public_encrypt - else: - crypt = backend._lib.RSA_private_decrypt - - key_size = backend._lib.RSA_size(key._rsa_cdata) - assert key_size > 0 - buf = backend._ffi.new("unsigned char[]", key_size) - res = crypt(len(data), data, buf, key._rsa_cdata, padding_enum) - if res < 0: - _handle_rsa_enc_dec_error(backend, key) - - return backend._ffi.buffer(buf)[:res] - - -def _handle_rsa_enc_dec_error(backend, key): - errors = backend._consume_errors() - assert errors - assert errors[0].lib == backend._lib.ERR_LIB_RSA - if isinstance(key, _RSAPublicKey): - assert (errors[0].reason == - backend._lib.RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE) - raise ValueError( - "Data too long for key size. Encrypt less data or use a " - "larger key size." - ) - else: - assert ( - errors[0].reason == backend._lib.RSA_R_BLOCK_TYPE_IS_NOT_01 or - errors[0].reason == backend._lib.RSA_R_BLOCK_TYPE_IS_NOT_02 - ) - raise ValueError("Decryption failed.") - - -@utils.register_interface(interfaces.AsymmetricSignatureContext) -class _RSASignatureContext(object): - def __init__(self, backend, private_key, padding, algorithm): - self._backend = backend - self._private_key = private_key - - if not isinstance(padding, interfaces.AsymmetricPadding): - raise TypeError( - "Expected provider of interfaces.AsymmetricPadding.") - - self._pkey_size = self._backend._lib.EVP_PKEY_size( - self._private_key._evp_pkey - ) - - if isinstance(padding, PKCS1v15): - if self._backend._lib.Cryptography_HAS_PKEY_CTX: - self._finalize_method = self._finalize_pkey_ctx - self._padding_enum = self._backend._lib.RSA_PKCS1_PADDING - else: - self._finalize_method = self._finalize_pkcs1 - elif isinstance(padding, PSS): - if not isinstance(padding._mgf, MGF1): - raise UnsupportedAlgorithm( - "Only MGF1 is supported by this backend.", - _Reasons.UNSUPPORTED_MGF - ) - - # Size of key in bytes - 2 is the maximum - # PSS signature length (salt length is checked later) - assert self._pkey_size > 0 - if self._pkey_size - algorithm.digest_size - 2 < 0: - raise ValueError("Digest too large for key size. Use a larger " - "key.") - - if not self._backend._mgf1_hash_supported(padding._mgf._algorithm): - raise UnsupportedAlgorithm( - "When OpenSSL is older than 1.0.1 then only SHA1 is " - "supported with MGF1.", - _Reasons.UNSUPPORTED_HASH - ) - - if self._backend._lib.Cryptography_HAS_PKEY_CTX: - self._finalize_method = self._finalize_pkey_ctx - self._padding_enum = self._backend._lib.RSA_PKCS1_PSS_PADDING - else: - self._finalize_method = self._finalize_pss - else: - raise UnsupportedAlgorithm( - "{0} is not supported by this backend.".format(padding.name), - _Reasons.UNSUPPORTED_PADDING - ) - - self._padding = padding - self._algorithm = algorithm - self._hash_ctx = hashes.Hash(self._algorithm, self._backend) - - def update(self, data): - self._hash_ctx.update(data) - - def finalize(self): - evp_md = self._backend._lib.EVP_get_digestbyname( - self._algorithm.name.encode("ascii")) - assert evp_md != self._backend._ffi.NULL - - return self._finalize_method(evp_md) - - def _finalize_pkey_ctx(self, evp_md): - pkey_ctx = self._backend._lib.EVP_PKEY_CTX_new( - self._private_key._evp_pkey, self._backend._ffi.NULL - ) - assert pkey_ctx != self._backend._ffi.NULL - pkey_ctx = self._backend._ffi.gc(pkey_ctx, - self._backend._lib.EVP_PKEY_CTX_free) - res = self._backend._lib.EVP_PKEY_sign_init(pkey_ctx) - assert res == 1 - res = self._backend._lib.EVP_PKEY_CTX_set_signature_md( - pkey_ctx, evp_md) - assert res > 0 - - res = self._backend._lib.EVP_PKEY_CTX_set_rsa_padding( - pkey_ctx, self._padding_enum) - assert res > 0 - if isinstance(self._padding, PSS): - res = self._backend._lib.EVP_PKEY_CTX_set_rsa_pss_saltlen( - pkey_ctx, - _get_rsa_pss_salt_length( - self._padding, - self._private_key.key_size, - self._hash_ctx.algorithm.digest_size - ) - ) - assert res > 0 - - if self._backend._lib.Cryptography_HAS_MGF1_MD: - # MGF1 MD is configurable in OpenSSL 1.0.1+ - mgf1_md = self._backend._lib.EVP_get_digestbyname( - self._padding._mgf._algorithm.name.encode("ascii")) - assert mgf1_md != self._backend._ffi.NULL - res = self._backend._lib.EVP_PKEY_CTX_set_rsa_mgf1_md( - pkey_ctx, mgf1_md - ) - assert res > 0 - data_to_sign = self._hash_ctx.finalize() - buflen = self._backend._ffi.new("size_t *") - res = self._backend._lib.EVP_PKEY_sign( - pkey_ctx, - self._backend._ffi.NULL, - buflen, - data_to_sign, - len(data_to_sign) - ) - assert res == 1 - buf = self._backend._ffi.new("unsigned char[]", buflen[0]) - res = self._backend._lib.EVP_PKEY_sign( - pkey_ctx, buf, buflen, data_to_sign, len(data_to_sign)) - if res != 1: - errors = self._backend._consume_errors() - assert errors[0].lib == self._backend._lib.ERR_LIB_RSA - reason = None - if (errors[0].reason == - self._backend._lib.RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE): - reason = ("Salt length too long for key size. Try using " - "MAX_LENGTH instead.") - elif (errors[0].reason == - self._backend._lib.RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY): - reason = "Digest too large for key size. Use a larger key." - assert reason is not None - raise ValueError(reason) - - return self._backend._ffi.buffer(buf)[:] - - def _finalize_pkcs1(self, evp_md): - if self._hash_ctx._ctx is None: - raise AlreadyFinalized("Context has already been finalized.") - - sig_buf = self._backend._ffi.new("char[]", self._pkey_size) - sig_len = self._backend._ffi.new("unsigned int *") - res = self._backend._lib.EVP_SignFinal( - self._hash_ctx._ctx._ctx, - sig_buf, - sig_len, - self._private_key._evp_pkey - ) - self._hash_ctx.finalize() - if res == 0: - errors = self._backend._consume_errors() - assert errors[0].lib == self._backend._lib.ERR_LIB_RSA - assert (errors[0].reason == - self._backend._lib.RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY) - raise ValueError("Digest too large for key size. Use a larger " - "key.") - - return self._backend._ffi.buffer(sig_buf)[:sig_len[0]] - - def _finalize_pss(self, evp_md): - data_to_sign = self._hash_ctx.finalize() - padded = self._backend._ffi.new("unsigned char[]", self._pkey_size) - res = self._backend._lib.RSA_padding_add_PKCS1_PSS( - self._private_key._rsa_cdata, - padded, - data_to_sign, - evp_md, - _get_rsa_pss_salt_length( - self._padding, - self._private_key.key_size, - len(data_to_sign) - ) - ) - if res != 1: - errors = self._backend._consume_errors() - assert errors[0].lib == self._backend._lib.ERR_LIB_RSA - assert (errors[0].reason == - self._backend._lib.RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE) - raise ValueError("Salt length too long for key size. Try using " - "MAX_LENGTH instead.") - - sig_buf = self._backend._ffi.new("char[]", self._pkey_size) - sig_len = self._backend._lib.RSA_private_encrypt( - self._pkey_size, - padded, - sig_buf, - self._private_key._rsa_cdata, - self._backend._lib.RSA_NO_PADDING - ) - assert sig_len != -1 - return self._backend._ffi.buffer(sig_buf)[:sig_len] - - -@utils.register_interface(interfaces.AsymmetricVerificationContext) -class _RSAVerificationContext(object): - def __init__(self, backend, public_key, signature, padding, algorithm): - self._backend = backend - self._public_key = public_key - self._signature = signature - - if not isinstance(padding, interfaces.AsymmetricPadding): - raise TypeError( - "Expected provider of interfaces.AsymmetricPadding.") - - self._pkey_size = self._backend._lib.EVP_PKEY_size( - self._public_key._evp_pkey - ) - - if isinstance(padding, PKCS1v15): - if self._backend._lib.Cryptography_HAS_PKEY_CTX: - self._verify_method = self._verify_pkey_ctx - self._padding_enum = self._backend._lib.RSA_PKCS1_PADDING - else: - self._verify_method = self._verify_pkcs1 - elif isinstance(padding, PSS): - if not isinstance(padding._mgf, MGF1): - raise UnsupportedAlgorithm( - "Only MGF1 is supported by this backend.", - _Reasons.UNSUPPORTED_MGF - ) - - # Size of key in bytes - 2 is the maximum - # PSS signature length (salt length is checked later) - assert self._pkey_size > 0 - if self._pkey_size - algorithm.digest_size - 2 < 0: - raise ValueError( - "Digest too large for key size. Check that you have the " - "correct key and digest algorithm." - ) - - if not self._backend._mgf1_hash_supported(padding._mgf._algorithm): - raise UnsupportedAlgorithm( - "When OpenSSL is older than 1.0.1 then only SHA1 is " - "supported with MGF1.", - _Reasons.UNSUPPORTED_HASH - ) - - if self._backend._lib.Cryptography_HAS_PKEY_CTX: - self._verify_method = self._verify_pkey_ctx - self._padding_enum = self._backend._lib.RSA_PKCS1_PSS_PADDING - else: - self._verify_method = self._verify_pss - else: - raise UnsupportedAlgorithm( - "{0} is not supported by this backend.".format(padding.name), - _Reasons.UNSUPPORTED_PADDING - ) - - self._padding = padding - self._algorithm = algorithm - self._hash_ctx = hashes.Hash(self._algorithm, self._backend) - - def update(self, data): - self._hash_ctx.update(data) - - def verify(self): - evp_md = self._backend._lib.EVP_get_digestbyname( - self._algorithm.name.encode("ascii")) - assert evp_md != self._backend._ffi.NULL - - self._verify_method(evp_md) - - def _verify_pkey_ctx(self, evp_md): - pkey_ctx = self._backend._lib.EVP_PKEY_CTX_new( - self._public_key._evp_pkey, self._backend._ffi.NULL - ) - assert pkey_ctx != self._backend._ffi.NULL - pkey_ctx = self._backend._ffi.gc(pkey_ctx, - self._backend._lib.EVP_PKEY_CTX_free) - res = self._backend._lib.EVP_PKEY_verify_init(pkey_ctx) - assert res == 1 - res = self._backend._lib.EVP_PKEY_CTX_set_signature_md( - pkey_ctx, evp_md) - assert res > 0 - - res = self._backend._lib.EVP_PKEY_CTX_set_rsa_padding( - pkey_ctx, self._padding_enum) - assert res > 0 - if isinstance(self._padding, PSS): - res = self._backend._lib.EVP_PKEY_CTX_set_rsa_pss_saltlen( - pkey_ctx, - _get_rsa_pss_salt_length( - self._padding, - self._public_key.key_size, - self._hash_ctx.algorithm.digest_size - ) - ) - assert res > 0 - if self._backend._lib.Cryptography_HAS_MGF1_MD: - # MGF1 MD is configurable in OpenSSL 1.0.1+ - mgf1_md = self._backend._lib.EVP_get_digestbyname( - self._padding._mgf._algorithm.name.encode("ascii")) - assert mgf1_md != self._backend._ffi.NULL - res = self._backend._lib.EVP_PKEY_CTX_set_rsa_mgf1_md( - pkey_ctx, mgf1_md - ) - assert res > 0 - - data_to_verify = self._hash_ctx.finalize() - res = self._backend._lib.EVP_PKEY_verify( - pkey_ctx, - self._signature, - len(self._signature), - data_to_verify, - len(data_to_verify) - ) - # The previous call can return negative numbers in the event of an - # error. This is not a signature failure but we need to fail if it - # occurs. - assert res >= 0 - if res == 0: - errors = self._backend._consume_errors() - assert errors - raise InvalidSignature - - def _verify_pkcs1(self, evp_md): - if self._hash_ctx._ctx is None: - raise AlreadyFinalized("Context has already been finalized.") - - res = self._backend._lib.EVP_VerifyFinal( - self._hash_ctx._ctx._ctx, - self._signature, - len(self._signature), - self._public_key._evp_pkey - ) - self._hash_ctx.finalize() - # The previous call can return negative numbers in the event of an - # error. This is not a signature failure but we need to fail if it - # occurs. - assert res >= 0 - if res == 0: - errors = self._backend._consume_errors() - assert errors - raise InvalidSignature - - def _verify_pss(self, evp_md): - buf = self._backend._ffi.new("unsigned char[]", self._pkey_size) - res = self._backend._lib.RSA_public_decrypt( - len(self._signature), - self._signature, - buf, - self._public_key._rsa_cdata, - self._backend._lib.RSA_NO_PADDING - ) - if res != self._pkey_size: - errors = self._backend._consume_errors() - assert errors - raise InvalidSignature - - data_to_verify = self._hash_ctx.finalize() - res = self._backend._lib.RSA_verify_PKCS1_PSS( - self._public_key._rsa_cdata, - data_to_verify, - evp_md, - buf, - _get_rsa_pss_salt_length( - self._padding, - self._public_key.key_size, - len(data_to_verify) - ) - ) - if res != 1: - errors = self._backend._consume_errors() - assert errors - raise InvalidSignature - - -@utils.register_interface(RSAPrivateKeyWithNumbers) -class _RSAPrivateKey(object): - def __init__(self, backend, rsa_cdata): - self._backend = backend - self._rsa_cdata = rsa_cdata - - evp_pkey = self._backend._lib.EVP_PKEY_new() - assert evp_pkey != self._backend._ffi.NULL - evp_pkey = self._backend._ffi.gc( - evp_pkey, self._backend._lib.EVP_PKEY_free - ) - res = self._backend._lib.EVP_PKEY_set1_RSA(evp_pkey, rsa_cdata) - assert res == 1 - self._evp_pkey = evp_pkey - - self._key_size = self._backend._lib.BN_num_bits(self._rsa_cdata.n) - - @property - def key_size(self): - return self._key_size - - def signer(self, padding, algorithm): - return _RSASignatureContext(self._backend, self, padding, algorithm) - - def decrypt(self, ciphertext, padding): - key_size_bytes = int(math.ceil(self.key_size / 8.0)) - if key_size_bytes != len(ciphertext): - raise ValueError("Ciphertext length must be equal to key size.") - - return _enc_dec_rsa(self._backend, self, ciphertext, padding) - - def public_key(self): - ctx = self._backend._lib.RSA_new() - assert ctx != self._backend._ffi.NULL - ctx = self._backend._ffi.gc(ctx, self._backend._lib.RSA_free) - ctx.e = self._backend._lib.BN_dup(self._rsa_cdata.e) - ctx.n = self._backend._lib.BN_dup(self._rsa_cdata.n) - res = self._backend._lib.RSA_blinding_on(ctx, self._backend._ffi.NULL) - assert res == 1 - return _RSAPublicKey(self._backend, ctx) - - def private_numbers(self): - return rsa.RSAPrivateNumbers( - p=self._backend._bn_to_int(self._rsa_cdata.p), - q=self._backend._bn_to_int(self._rsa_cdata.q), - d=self._backend._bn_to_int(self._rsa_cdata.d), - dmp1=self._backend._bn_to_int(self._rsa_cdata.dmp1), - dmq1=self._backend._bn_to_int(self._rsa_cdata.dmq1), - iqmp=self._backend._bn_to_int(self._rsa_cdata.iqmp), - public_numbers=rsa.RSAPublicNumbers( - e=self._backend._bn_to_int(self._rsa_cdata.e), - n=self._backend._bn_to_int(self._rsa_cdata.n), - ) - ) - - -@utils.register_interface(RSAPublicKeyWithNumbers) -class _RSAPublicKey(object): - def __init__(self, backend, rsa_cdata): - self._backend = backend - self._rsa_cdata = rsa_cdata - - evp_pkey = self._backend._lib.EVP_PKEY_new() - assert evp_pkey != self._backend._ffi.NULL - evp_pkey = self._backend._ffi.gc( - evp_pkey, self._backend._lib.EVP_PKEY_free - ) - res = self._backend._lib.EVP_PKEY_set1_RSA(evp_pkey, rsa_cdata) - assert res == 1 - self._evp_pkey = evp_pkey - - self._key_size = self._backend._lib.BN_num_bits(self._rsa_cdata.n) - - @property - def key_size(self): - return self._key_size - - def verifier(self, signature, padding, algorithm): - return _RSAVerificationContext( - self._backend, self, signature, padding, algorithm - ) - - def encrypt(self, plaintext, padding): - return _enc_dec_rsa(self._backend, self, plaintext, padding) - - def public_numbers(self): - return rsa.RSAPublicNumbers( - e=self._backend._bn_to_int(self._rsa_cdata.e), - n=self._backend._bn_to_int(self._rsa_cdata.n), - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/binding.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/binding.py deleted file mode 100644 index e23a2fd..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/binding.py +++ /dev/null @@ -1,54 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography.hazmat.bindings.utils import build_ffi - - -class Binding(object): - """ - CommonCrypto API wrapper. - """ - _module_prefix = "cryptography.hazmat.bindings.commoncrypto." - _modules = [ - "cf", - "common_digest", - "common_hmac", - "common_key_derivation", - "common_cryptor", - "secimport", - "secitem", - "seckey", - "seckeychain", - "sectransform", - ] - - ffi = None - lib = None - - def __init__(self): - self._ensure_ffi_initialized() - - @classmethod - def _ensure_ffi_initialized(cls): - if cls.ffi is not None and cls.lib is not None: - return - - cls.ffi, cls.lib = build_ffi( - module_prefix=cls._module_prefix, - modules=cls._modules, - extra_link_args=[ - "-framework", "Security", "-framework", "CoreFoundation" - ] - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/cf.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/cf.py deleted file mode 100644 index 671963a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/cf.py +++ /dev/null @@ -1,114 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef bool Boolean; -typedef signed long OSStatus; -typedef unsigned char UInt8; -typedef uint32_t UInt32; - -typedef const void * CFAllocatorRef; -const CFAllocatorRef kCFAllocatorDefault; -typedef const void * CFDataRef; -typedef signed long long CFIndex; -typedef ... *CFStringRef; -typedef ... *CFArrayRef; -typedef ... *CFBooleanRef; -typedef ... *CFErrorRef; -typedef ... *CFNumberRef; -typedef ... *CFTypeRef; -typedef ... *CFDictionaryRef; -typedef ... *CFMutableDictionaryRef; -typedef struct { - ...; -} CFDictionaryKeyCallBacks; -typedef struct { - ...; -} CFDictionaryValueCallBacks; -typedef struct { - ...; -} CFRange; - -typedef UInt32 CFStringEncoding; -enum { - kCFStringEncodingASCII = 0x0600 -}; - -enum { - kCFNumberSInt8Type = 1, - kCFNumberSInt16Type = 2, - kCFNumberSInt32Type = 3, - kCFNumberSInt64Type = 4, - kCFNumberFloat32Type = 5, - kCFNumberFloat64Type = 6, - kCFNumberCharType = 7, - kCFNumberShortType = 8, - kCFNumberIntType = 9, - kCFNumberLongType = 10, - kCFNumberLongLongType = 11, - kCFNumberFloatType = 12, - kCFNumberDoubleType = 13, - kCFNumberCFIndexType = 14, - kCFNumberNSIntegerType = 15, - kCFNumberCGFloatType = 16, - kCFNumberMaxType = 16 -}; -typedef int CFNumberType; - -const CFDictionaryKeyCallBacks kCFTypeDictionaryKeyCallBacks; -const CFDictionaryValueCallBacks kCFTypeDictionaryValueCallBacks; - -const CFBooleanRef kCFBooleanTrue; -const CFBooleanRef kCFBooleanFalse; -""" - -FUNCTIONS = """ -CFDataRef CFDataCreate(CFAllocatorRef, const UInt8 *, CFIndex); -CFStringRef CFStringCreateWithCString(CFAllocatorRef, const char *, - CFStringEncoding); -CFDictionaryRef CFDictionaryCreate(CFAllocatorRef, const void **, - const void **, CFIndex, - const CFDictionaryKeyCallBacks *, - const CFDictionaryValueCallBacks *); -CFMutableDictionaryRef CFDictionaryCreateMutable( - CFAllocatorRef, - CFIndex, - const CFDictionaryKeyCallBacks *, - const CFDictionaryValueCallBacks * -); -void CFDictionarySetValue(CFMutableDictionaryRef, const void *, const void *); -CFIndex CFArrayGetCount(CFArrayRef); -const void *CFArrayGetValueAtIndex(CFArrayRef, CFIndex); -CFIndex CFDataGetLength(CFDataRef); -void CFDataGetBytes(CFDataRef, CFRange, UInt8 *); -CFRange CFRangeMake(CFIndex, CFIndex); -void CFShow(CFTypeRef); -Boolean CFBooleanGetValue(CFBooleanRef); -CFNumberRef CFNumberCreate(CFAllocatorRef, CFNumberType, const void *); -void CFRelease(CFTypeRef); -CFTypeRef CFRetain(CFTypeRef); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_cryptor.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_cryptor.py deleted file mode 100644 index 713bc56..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_cryptor.py +++ /dev/null @@ -1,110 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -enum { - kCCAlgorithmAES128 = 0, - kCCAlgorithmDES, - kCCAlgorithm3DES, - kCCAlgorithmCAST, - kCCAlgorithmRC4, - kCCAlgorithmRC2, - kCCAlgorithmBlowfish -}; -typedef uint32_t CCAlgorithm; -enum { - kCCSuccess = 0, - kCCParamError = -4300, - kCCBufferTooSmall = -4301, - kCCMemoryFailure = -4302, - kCCAlignmentError = -4303, - kCCDecodeError = -4304, - kCCUnimplemented = -4305 -}; -typedef int32_t CCCryptorStatus; -typedef uint32_t CCOptions; -enum { - kCCEncrypt = 0, - kCCDecrypt, -}; -typedef uint32_t CCOperation; -typedef ... *CCCryptorRef; - -enum { - kCCModeOptionCTR_LE = 0x0001, - kCCModeOptionCTR_BE = 0x0002 -}; - -typedef uint32_t CCModeOptions; - -enum { - kCCModeECB = 1, - kCCModeCBC = 2, - kCCModeCFB = 3, - kCCModeCTR = 4, - kCCModeF8 = 5, - kCCModeLRW = 6, - kCCModeOFB = 7, - kCCModeXTS = 8, - kCCModeRC4 = 9, - kCCModeCFB8 = 10, - kCCModeGCM = 11 -}; -typedef uint32_t CCMode; -enum { - ccNoPadding = 0, - ccPKCS7Padding = 1, -}; -typedef uint32_t CCPadding; -""" - -FUNCTIONS = """ -CCCryptorStatus CCCryptorCreateWithMode(CCOperation, CCMode, CCAlgorithm, - CCPadding, const void *, const void *, - size_t, const void *, size_t, int, - CCModeOptions, CCCryptorRef *); -CCCryptorStatus CCCryptorCreate(CCOperation, CCAlgorithm, CCOptions, - const void *, size_t, const void *, - CCCryptorRef *); -CCCryptorStatus CCCryptorUpdate(CCCryptorRef, const void *, size_t, void *, - size_t, size_t *); -CCCryptorStatus CCCryptorFinal(CCCryptorRef, void *, size_t, size_t *); -CCCryptorStatus CCCryptorRelease(CCCryptorRef); - -CCCryptorStatus CCCryptorGCMAddIV(CCCryptorRef, const void *, size_t); -CCCryptorStatus CCCryptorGCMAddAAD(CCCryptorRef, const void *, size_t); -CCCryptorStatus CCCryptorGCMEncrypt(CCCryptorRef, const void *, size_t, - void *); -CCCryptorStatus CCCryptorGCMDecrypt(CCCryptorRef, const void *, size_t, - void *); -CCCryptorStatus CCCryptorGCMFinal(CCCryptorRef, const void *, size_t *); -CCCryptorStatus CCCryptorGCMReset(CCCryptorRef); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -/* Not defined in the public header */ -enum { - kCCModeGCM = 11 -}; -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_digest.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_digest.py deleted file mode 100644 index c59200c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_digest.py +++ /dev/null @@ -1,69 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef uint32_t CC_LONG; -typedef uint64_t CC_LONG64; -typedef struct CC_MD5state_st { - ...; -} CC_MD5_CTX; -typedef struct CC_SHA1state_st { - ...; -} CC_SHA1_CTX; -typedef struct CC_SHA256state_st { - ...; -} CC_SHA256_CTX; -typedef struct CC_SHA512state_st { - ...; -} CC_SHA512_CTX; -""" - -FUNCTIONS = """ -int CC_MD5_Init(CC_MD5_CTX *); -int CC_MD5_Update(CC_MD5_CTX *, const void *, CC_LONG); -int CC_MD5_Final(unsigned char *, CC_MD5_CTX *); - -int CC_SHA1_Init(CC_SHA1_CTX *); -int CC_SHA1_Update(CC_SHA1_CTX *, const void *, CC_LONG); -int CC_SHA1_Final(unsigned char *, CC_SHA1_CTX *); - -int CC_SHA224_Init(CC_SHA256_CTX *); -int CC_SHA224_Update(CC_SHA256_CTX *, const void *, CC_LONG); -int CC_SHA224_Final(unsigned char *, CC_SHA256_CTX *); - -int CC_SHA256_Init(CC_SHA256_CTX *); -int CC_SHA256_Update(CC_SHA256_CTX *, const void *, CC_LONG); -int CC_SHA256_Final(unsigned char *, CC_SHA256_CTX *); - -int CC_SHA384_Init(CC_SHA512_CTX *); -int CC_SHA384_Update(CC_SHA512_CTX *, const void *, CC_LONG); -int CC_SHA384_Final(unsigned char *, CC_SHA512_CTX *); - -int CC_SHA512_Init(CC_SHA512_CTX *); -int CC_SHA512_Update(CC_SHA512_CTX *, const void *, CC_LONG); -int CC_SHA512_Final(unsigned char *, CC_SHA512_CTX *); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_hmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_hmac.py deleted file mode 100644 index 4f54b62..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_hmac.py +++ /dev/null @@ -1,48 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct { - ...; -} CCHmacContext; -enum { - kCCHmacAlgSHA1, - kCCHmacAlgMD5, - kCCHmacAlgSHA256, - kCCHmacAlgSHA384, - kCCHmacAlgSHA512, - kCCHmacAlgSHA224 -}; -typedef uint32_t CCHmacAlgorithm; -""" - -FUNCTIONS = """ -void CCHmacInit(CCHmacContext *, CCHmacAlgorithm, const void *, size_t); -void CCHmacUpdate(CCHmacContext *, const void *, size_t); -void CCHmacFinal(CCHmacContext *, void *); - -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py deleted file mode 100644 index e8cc03e..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/common_key_derivation.py +++ /dev/null @@ -1,50 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -enum { - kCCPBKDF2 = 2, -}; -typedef uint32_t CCPBKDFAlgorithm; -enum { - kCCPRFHmacAlgSHA1 = 1, - kCCPRFHmacAlgSHA224 = 2, - kCCPRFHmacAlgSHA256 = 3, - kCCPRFHmacAlgSHA384 = 4, - kCCPRFHmacAlgSHA512 = 5, -}; -typedef uint32_t CCPseudoRandomAlgorithm; -typedef unsigned int uint; -""" - -FUNCTIONS = """ -int CCKeyDerivationPBKDF(CCPBKDFAlgorithm, const char *, size_t, - const uint8_t *, size_t, CCPseudoRandomAlgorithm, - uint, uint8_t *, size_t); -uint CCCalibratePBKDF(CCPBKDFAlgorithm, size_t, size_t, - CCPseudoRandomAlgorithm, size_t, uint32_t); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secimport.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secimport.py deleted file mode 100644 index add62c7..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secimport.py +++ /dev/null @@ -1,95 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... *SecAccessRef; - -CFStringRef kSecImportExportPassphrase; -CFStringRef kSecImportExportKeychain; -CFStringRef kSecImportExportAccess; - -typedef uint32_t SecExternalItemType; -enum { - kSecItemTypeUnknown, - kSecItemTypePrivateKey, - kSecItemTypePublicKey, - kSecItemTypeSessionKey, - kSecItemTypeCertificate, - kSecItemTypeAggregate -}; - - -typedef uint32_t SecExternalFormat; -enum { - kSecFormatUnknown = 0, - kSecFormatOpenSSL, - kSecFormatSSH, - kSecFormatBSAFE, - kSecFormatRawKey, - kSecFormatWrappedPKCS8, - kSecFormatWrappedOpenSSL, - kSecFormatWrappedSSH, - kSecFormatWrappedLSH, - kSecFormatX509Cert, - kSecFormatPEMSequence, - kSecFormatPKCS7, - kSecFormatPKCS12, - kSecFormatNetscapeCertSequence, - kSecFormatSSHv2 -}; - -typedef uint32_t SecItemImportExportFlags; -enum { - kSecKeyImportOnlyOne = 0x00000001, - kSecKeySecurePassphrase = 0x00000002, - kSecKeyNoAccessControl = 0x00000004 -}; -typedef uint32_t SecKeyImportExportFlags; - -typedef struct { - /* for import and export */ - uint32_t version; - SecKeyImportExportFlags flags; - CFTypeRef passphrase; - CFStringRef alertTitle; - CFStringRef alertPrompt; - - /* for import only */ - SecAccessRef accessRef; - CFArrayRef keyUsage; - - CFArrayRef keyAttributes; -} SecItemImportExportKeyParameters; -""" - -FUNCTIONS = """ -OSStatus SecItemImport(CFDataRef, CFStringRef, SecExternalFormat *, - SecExternalItemType *, SecItemImportExportFlags, - const SecItemImportExportKeyParameters *, - SecKeychainRef, CFArrayRef *); -OSStatus SecPKCS12Import(CFDataRef, CFDictionaryRef, CFArrayRef *); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secitem.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secitem.py deleted file mode 100644 index ac3dad3..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/secitem.py +++ /dev/null @@ -1,38 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -const CFTypeRef kSecAttrKeyType; -const CFTypeRef kSecAttrKeySizeInBits; -const CFTypeRef kSecAttrIsPermanent; -const CFTypeRef kSecAttrKeyTypeRSA; -const CFTypeRef kSecAttrKeyTypeDSA; -const CFTypeRef kSecUseKeychain; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckey.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckey.py deleted file mode 100644 index 5e4b6da..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckey.py +++ /dev/null @@ -1,35 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... *SecKeyRef; -""" - -FUNCTIONS = """ -OSStatus SecKeyGeneratePair(CFDictionaryRef, SecKeyRef *, SecKeyRef *); -size_t SecKeyGetBlockSize(SecKeyRef); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckeychain.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckeychain.py deleted file mode 100644 index c045c34..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/seckeychain.py +++ /dev/null @@ -1,36 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... *SecKeychainRef; -""" - -FUNCTIONS = """ -OSStatus SecKeychainCreate(const char *, UInt32, const void *, Boolean, - SecAccessRef, SecKeychainRef *); -OSStatus SecKeychainDelete(SecKeychainRef); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/sectransform.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/sectransform.py deleted file mode 100644 index d6dbc5f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/commoncrypto/sectransform.py +++ /dev/null @@ -1,79 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -#include -#include -""" - -TYPES = """ -typedef ... *SecTransformRef; - -CFStringRef kSecImportExportPassphrase; -CFStringRef kSecImportExportKeychain; -CFStringRef kSecImportExportAccess; - -CFStringRef kSecEncryptionMode; -CFStringRef kSecEncryptKey; -CFStringRef kSecIVKey; -CFStringRef kSecModeCBCKey; -CFStringRef kSecModeCFBKey; -CFStringRef kSecModeECBKey; -CFStringRef kSecModeNoneKey; -CFStringRef kSecModeOFBKey; -CFStringRef kSecOAEPEncodingParametersAttributeName; -CFStringRef kSecPaddingKey; -CFStringRef kSecPaddingNoneKey; -CFStringRef kSecPaddingOAEPKey; -CFStringRef kSecPaddingPKCS1Key; -CFStringRef kSecPaddingPKCS5Key; -CFStringRef kSecPaddingPKCS7Key; - -const CFStringRef kSecTransformInputAttributeName; -const CFStringRef kSecTransformOutputAttributeName; -const CFStringRef kSecTransformDebugAttributeName; -const CFStringRef kSecTransformTransformName; -const CFStringRef kSecTransformAbortAttributeName; - -CFStringRef kSecInputIsAttributeName; -CFStringRef kSecInputIsPlainText; -CFStringRef kSecInputIsDigest; -CFStringRef kSecInputIsRaw; - -const CFStringRef kSecDigestTypeAttribute; -const CFStringRef kSecDigestLengthAttribute; -const CFStringRef kSecDigestMD5; -const CFStringRef kSecDigestSHA1; -const CFStringRef kSecDigestSHA2; -""" - -FUNCTIONS = """ -Boolean SecTransformSetAttribute(SecTransformRef, CFStringRef, CFTypeRef, - CFErrorRef *); -SecTransformRef SecDecryptTransformCreate(SecKeyRef, CFErrorRef *); -SecTransformRef SecEncryptTransformCreate(SecKeyRef, CFErrorRef *); -SecTransformRef SecVerifyTransformCreate(SecKeyRef, CFDataRef, CFErrorRef *); -SecTransformRef SecSignTransformCreate(SecKeyRef, CFErrorRef *) ; -CFTypeRef SecTransformExecute(SecTransformRef, CFErrorRef *); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/aes.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/aes.py deleted file mode 100644 index e407152..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/aes.py +++ /dev/null @@ -1,70 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -static const int Cryptography_HAS_AES_WRAP; - -struct aes_key_st { - ...; -}; -typedef struct aes_key_st AES_KEY; -""" - -FUNCTIONS = """ -int AES_set_encrypt_key(const unsigned char *, const int, AES_KEY *); -int AES_set_decrypt_key(const unsigned char *, const int, AES_KEY *); -""" - -MACROS = """ -/* these can be moved back to FUNCTIONS once we drop support for 0.9.8h. - This should be when we drop RHEL/CentOS 5, which is on 0.9.8e. */ -int AES_wrap_key(AES_KEY *, const unsigned char *, unsigned char *, - const unsigned char *, unsigned int); -int AES_unwrap_key(AES_KEY *, const unsigned char *, unsigned char *, - const unsigned char *, unsigned int); - -/* The ctr128_encrypt function is only useful in 0.9.8. You should use EVP for - this in 1.0.0+. It is defined in macros because the function signature - changed after 0.9.8 */ -void AES_ctr128_encrypt(const unsigned char *, unsigned char *, - const size_t, const AES_KEY *, - unsigned char[], unsigned char[], unsigned int *); - -""" - -CUSTOMIZATIONS = """ -/* OpenSSL 0.9.8h+ */ -#if OPENSSL_VERSION_NUMBER >= 0x0090808fL -static const long Cryptography_HAS_AES_WRAP = 1; -#else -static const long Cryptography_HAS_AES_WRAP = 0; -int (*AES_wrap_key)(AES_KEY *, const unsigned char *, unsigned char *, - const unsigned char *, unsigned int) = NULL; -int (*AES_unwrap_key)(AES_KEY *, const unsigned char *, unsigned char *, - const unsigned char *, unsigned int) = NULL; -#endif - -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_AES_WRAP": [ - "AES_wrap_key", - "AES_unwrap_key", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/asn1.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/asn1.py deleted file mode 100644 index 2edfd2d..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/asn1.py +++ /dev/null @@ -1,152 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -/* - * TODO: This typedef is wrong. - * - * This is due to limitations of cffi. - * See https://bitbucket.org/cffi/cffi/issue/69 - * - * For another possible work-around (not used here because it involves more - * complicated use of the cffi API which falls outside the general pattern used - * by this package), see - * http://paste.pound-python.org/show/iJcTUMkKeBeS6yXpZWUU/ - * - * The work-around used here is to just be sure to declare a type that is at - * least as large as the real type. Maciej explains: - * - * I think you want to declare your value too large (e.g. long) - * that way you'll never pass garbage - */ -typedef intptr_t time_t; - -typedef int ASN1_BOOLEAN; -typedef ... ASN1_INTEGER; - -struct asn1_string_st { - int length; - int type; - unsigned char *data; - long flags; -}; - -typedef struct asn1_string_st ASN1_OCTET_STRING; -typedef struct asn1_string_st ASN1_IA5STRING; -typedef ... ASN1_OBJECT; -typedef ... ASN1_STRING; -typedef ... ASN1_TYPE; -typedef ... ASN1_GENERALIZEDTIME; -typedef ... ASN1_ENUMERATED; -typedef ... ASN1_ITEM; -typedef ... ASN1_VALUE; - -typedef struct { - ...; -} ASN1_TIME; -typedef ... ASN1_ITEM_EXP; - -typedef ... ASN1_UTCTIME; - -static const int V_ASN1_GENERALIZEDTIME; - -static const int MBSTRING_UTF8; -""" - -FUNCTIONS = """ -ASN1_OBJECT *ASN1_OBJECT_new(void); -void ASN1_OBJECT_free(ASN1_OBJECT *); - -/* ASN1 OBJECT IDENTIFIER */ -ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **, const unsigned char **, long); -int i2d_ASN1_OBJECT(ASN1_OBJECT *, unsigned char **); - -/* ASN1 STRING */ -ASN1_STRING *ASN1_STRING_new(void); -ASN1_STRING *ASN1_STRING_type_new(int); -void ASN1_STRING_free(ASN1_STRING *); -unsigned char *ASN1_STRING_data(ASN1_STRING *); -int ASN1_STRING_set(ASN1_STRING *, const void *, int); -int ASN1_STRING_type(ASN1_STRING *); -int ASN1_STRING_to_UTF8(unsigned char **, ASN1_STRING *); - -/* ASN1 OCTET STRING */ -ASN1_OCTET_STRING *ASN1_OCTET_STRING_new(void); -void ASN1_OCTET_STRING_free(ASN1_OCTET_STRING *); -int ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *, const unsigned char *, int); - -/* ASN1 INTEGER */ -ASN1_INTEGER *ASN1_INTEGER_new(void); -void ASN1_INTEGER_free(ASN1_INTEGER *); -int ASN1_INTEGER_set(ASN1_INTEGER *, long); -int i2a_ASN1_INTEGER(BIO *, ASN1_INTEGER *); - -/* ASN1 TIME */ -ASN1_TIME *ASN1_TIME_new(void); -void ASN1_TIME_free(ASN1_TIME *); -ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *, - ASN1_GENERALIZEDTIME **); - -/* ASN1 UTCTIME */ -int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *, time_t); - -/* ASN1 GENERALIZEDTIME */ -int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *, const char *); -void ASN1_GENERALIZEDTIME_free(ASN1_GENERALIZEDTIME *); - -/* ASN1 ENUMERATED */ -ASN1_ENUMERATED *ASN1_ENUMERATED_new(void); -void ASN1_ENUMERATED_free(ASN1_ENUMERATED *); -int ASN1_ENUMERATED_set(ASN1_ENUMERATED *, long); - -ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **, const unsigned char **, long, - const ASN1_ITEM *); -""" - -MACROS = """ -ASN1_TIME *M_ASN1_TIME_dup(void *); -const ASN1_ITEM *ASN1_ITEM_ptr(ASN1_ITEM_EXP *); - -/* These aren't macros these arguments are all const X on openssl > 1.0.x */ - -int ASN1_STRING_length(ASN1_STRING *); -ASN1_STRING *ASN1_STRING_dup(ASN1_STRING *); -int ASN1_STRING_cmp(ASN1_STRING *, ASN1_STRING *); - -ASN1_OCTET_STRING *ASN1_OCTET_STRING_dup(ASN1_OCTET_STRING *); -int ASN1_OCTET_STRING_cmp(ASN1_OCTET_STRING *, ASN1_OCTET_STRING *); - -ASN1_INTEGER *ASN1_INTEGER_dup(ASN1_INTEGER *); -int ASN1_INTEGER_cmp(ASN1_INTEGER *, ASN1_INTEGER *); -long ASN1_INTEGER_get(ASN1_INTEGER *); - -BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *, BIGNUM *); -ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *, ASN1_INTEGER *); - -/* These isn't a macro the arg is const on openssl 1.0.2+ */ -int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME *); - -/* Not a macro, const on openssl 1.0 */ -int ASN1_STRING_set_default_mask_asc(char *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bignum.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bignum.py deleted file mode 100644 index 1d944ee..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bignum.py +++ /dev/null @@ -1,114 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... BN_CTX; -typedef ... BIGNUM; -/* - * TODO: This typedef is wrong. - * - * This is due to limitations of cffi. - * See https://bitbucket.org/cffi/cffi/issue/69 - * - * For another possible work-around (not used here because it involves more - * complicated use of the cffi API which falls outside the general pattern used - * by this package), see - * http://paste.pound-python.org/show/iJcTUMkKeBeS6yXpZWUU/ - * - * The work-around used here is to just be sure to declare a type that is at - * least as large as the real type. Maciej explains: - * - * I think you want to declare your value too large (e.g. long) - * that way you'll never pass garbage - */ -typedef uintptr_t BN_ULONG; -""" - -FUNCTIONS = """ -BIGNUM *BN_new(void); -void BN_free(BIGNUM *); - -BN_CTX *BN_CTX_new(void); -void BN_CTX_free(BN_CTX *); - -void BN_CTX_start(BN_CTX *); -BIGNUM *BN_CTX_get(BN_CTX *); -void BN_CTX_end(BN_CTX *); - -BIGNUM *BN_copy(BIGNUM *, const BIGNUM *); -BIGNUM *BN_dup(const BIGNUM *); - -int BN_set_word(BIGNUM *, BN_ULONG); -BN_ULONG BN_get_word(const BIGNUM *); - -const BIGNUM *BN_value_one(void); - -char *BN_bn2hex(const BIGNUM *); -int BN_hex2bn(BIGNUM **, const char *); -int BN_dec2bn(BIGNUM **, const char *); - -int BN_bn2bin(const BIGNUM *, unsigned char *); -BIGNUM *BN_bin2bn(const unsigned char *, int, BIGNUM *); - -int BN_num_bits(const BIGNUM *); - -int BN_cmp(const BIGNUM *, const BIGNUM *); -int BN_add(BIGNUM *, const BIGNUM *, const BIGNUM *); -int BN_sub(BIGNUM *, const BIGNUM *, const BIGNUM *); -int BN_mul(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int BN_sqr(BIGNUM *, const BIGNUM *, BN_CTX *); -int BN_div(BIGNUM *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int BN_nnmod(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int BN_mod_add(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, - BN_CTX *); -int BN_mod_sub(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, - BN_CTX *); -int BN_mod_mul(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, - BN_CTX *); -int BN_mod_sqr(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int BN_exp(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int BN_mod_exp(BIGNUM *, const BIGNUM *, const BIGNUM *, const BIGNUM *, - BN_CTX *); -int BN_gcd(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -BIGNUM *BN_mod_inverse(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); - -int BN_set_bit(BIGNUM *, int); -int BN_clear_bit(BIGNUM *, int); - -int BN_is_bit_set(const BIGNUM *, int); - -int BN_mask_bits(BIGNUM *, int); -""" - -MACROS = """ -int BN_zero(BIGNUM *); -int BN_one(BIGNUM *); -int BN_mod(BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); - -int BN_lshift(BIGNUM *, const BIGNUM *, int); -int BN_lshift1(BIGNUM *, BIGNUM *); - -int BN_rshift(BIGNUM *, BIGNUM *, int); -int BN_rshift1(BIGNUM *, BIGNUM *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/binding.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/binding.py deleted file mode 100644 index 37891f6..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/binding.py +++ /dev/null @@ -1,168 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import os -import sys -import threading - -from cryptography.hazmat.bindings.utils import build_ffi - - -_OSX_PRE_INCLUDE = """ -#ifdef __APPLE__ -#include -#define __ORIG_DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER \ - DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER -#undef DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER -#define DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER -#endif -""" - -_OSX_POST_INCLUDE = """ -#ifdef __APPLE__ -#undef DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER -#define DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER \ - __ORIG_DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER -#endif -""" - - -class Binding(object): - """ - OpenSSL API wrapper. - """ - _module_prefix = "cryptography.hazmat.bindings.openssl." - _modules = [ - "aes", - "asn1", - "bignum", - "bio", - "cmac", - "cms", - "conf", - "crypto", - "dh", - "dsa", - "ec", - "ecdh", - "ecdsa", - "engine", - "err", - "evp", - "hmac", - "nid", - "objects", - "opensslv", - "osrandom_engine", - "pem", - "pkcs7", - "pkcs12", - "rand", - "rsa", - "ssl", - "x509", - "x509name", - "x509v3", - "x509_vfy" - ] - - _locks = None - _lock_cb_handle = None - _lock_init_lock = threading.Lock() - - ffi = None - lib = None - - def __init__(self): - self._ensure_ffi_initialized() - - @classmethod - def _ensure_ffi_initialized(cls): - if cls.ffi is not None and cls.lib is not None: - return - - # OpenSSL goes by a different library name on different operating - # systems. - if sys.platform != "win32": - # In some circumstances, the order in which these libs are - # specified on the linker command-line is significant; - # libssl must come before libcrypto - # (http://marc.info/?l=openssl-users&m=135361825921871) - libraries = ["ssl", "crypto"] - else: # pragma: no cover - link_type = os.environ.get("PYCA_WINDOWS_LINK_TYPE", "static") - libraries = _get_windows_libraries(link_type) - - cls.ffi, cls.lib = build_ffi( - module_prefix=cls._module_prefix, - modules=cls._modules, - pre_include=_OSX_PRE_INCLUDE, - post_include=_OSX_POST_INCLUDE, - libraries=libraries, - ) - res = cls.lib.Cryptography_add_osrandom_engine() - assert res != 0 - - @classmethod - def init_static_locks(cls): - with cls._lock_init_lock: - cls._ensure_ffi_initialized() - - if not cls._lock_cb_handle: - cls._lock_cb_handle = cls.ffi.callback( - "void(int, int, const char *, int)", - cls._lock_cb - ) - - # Use Python's implementation if available, importing _ssl triggers - # the setup for this. - __import__("_ssl") - - if cls.lib.CRYPTO_get_locking_callback() != cls.ffi.NULL: - return - - # If nothing else has setup a locking callback already, we set up - # our own - num_locks = cls.lib.CRYPTO_num_locks() - cls._locks = [threading.Lock() for n in range(num_locks)] - - cls.lib.CRYPTO_set_locking_callback(cls._lock_cb_handle) - - @classmethod - def _lock_cb(cls, mode, n, file, line): - lock = cls._locks[n] - - if mode & cls.lib.CRYPTO_LOCK: - lock.acquire() - elif mode & cls.lib.CRYPTO_UNLOCK: - lock.release() - else: - raise RuntimeError( - "Unknown lock mode {0}: lock={1}, file={2}, line={3}.".format( - mode, n, file, line - ) - ) - - -def _get_windows_libraries(link_type): - if link_type == "dynamic": - return ["libeay32", "ssleay32", "advapi32"] - elif link_type == "static" or link_type == "": - return ["libeay32mt", "ssleay32mt", "advapi32", - "crypt32", "gdi32", "user32", "ws2_32"] - else: - raise ValueError( - "PYCA_WINDOWS_LINK_TYPE must be 'static' or 'dynamic'" - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bio.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bio.py deleted file mode 100644 index cfe6034..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/bio.py +++ /dev/null @@ -1,181 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct bio_st BIO; -typedef void bio_info_cb(BIO *, int, const char *, int, long, long); -struct bio_method_st { - int type; - const char *name; - int (*bwrite)(BIO *, const char *, int); - int (*bread)(BIO *, char *, int); - int (*bputs)(BIO *, const char *); - int (*bgets)(BIO *, char*, int); - long (*ctrl)(BIO *, int, long, void *); - int (*create)(BIO *); - int (*destroy)(BIO *); - long (*callback_ctrl)(BIO *, int, bio_info_cb *); - ...; -}; -typedef struct bio_method_st BIO_METHOD; -struct bio_st { - BIO_METHOD *method; - long (*callback)(struct bio_st*, int, const char*, int, long, long); - char *cb_arg; - int init; - int shutdown; - int flags; - int retry_reason; - int num; - void *ptr; - struct bio_st *next_bio; - struct bio_st *prev_bio; - int references; - unsigned long num_read; - unsigned long num_write; - ...; -}; -typedef ... BUF_MEM; - -static const int BIO_TYPE_MEM; -static const int BIO_TYPE_FILE; -static const int BIO_TYPE_FD; -static const int BIO_TYPE_SOCKET; -static const int BIO_TYPE_CONNECT; -static const int BIO_TYPE_ACCEPT; -static const int BIO_TYPE_NULL; -static const int BIO_CLOSE; -static const int BIO_NOCLOSE; -static const int BIO_TYPE_SOURCE_SINK; -static const int BIO_CTRL_RESET; -static const int BIO_CTRL_EOF; -static const int BIO_CTRL_SET; -static const int BIO_CTRL_SET_CLOSE; -static const int BIO_CTRL_FLUSH; -static const int BIO_CTRL_DUP; -static const int BIO_CTRL_GET_CLOSE; -static const int BIO_CTRL_INFO; -static const int BIO_CTRL_GET; -static const int BIO_CTRL_PENDING; -static const int BIO_CTRL_WPENDING; -static const int BIO_C_FILE_SEEK; -static const int BIO_C_FILE_TELL; -static const int BIO_TYPE_NONE; -static const int BIO_TYPE_PROXY_CLIENT; -static const int BIO_TYPE_PROXY_SERVER; -static const int BIO_TYPE_NBIO_TEST; -static const int BIO_TYPE_BER; -static const int BIO_TYPE_BIO; -static const int BIO_TYPE_DESCRIPTOR; -static const int BIO_FLAGS_READ; -static const int BIO_FLAGS_WRITE; -static const int BIO_FLAGS_IO_SPECIAL; -static const int BIO_FLAGS_RWS; -static const int BIO_FLAGS_SHOULD_RETRY; -static const int BIO_TYPE_NULL_FILTER; -static const int BIO_TYPE_SSL; -static const int BIO_TYPE_MD; -static const int BIO_TYPE_BUFFER; -static const int BIO_TYPE_CIPHER; -static const int BIO_TYPE_BASE64; -static const int BIO_TYPE_FILTER; -""" - -FUNCTIONS = """ -BIO* BIO_new(BIO_METHOD *); -int BIO_set(BIO *, BIO_METHOD *); -int BIO_free(BIO *); -void BIO_vfree(BIO *); -void BIO_free_all(BIO *); -BIO *BIO_push(BIO *, BIO *); -BIO *BIO_pop(BIO *); -BIO *BIO_next(BIO *); -BIO *BIO_find_type(BIO *, int); -BIO_METHOD *BIO_s_mem(void); -BIO *BIO_new_mem_buf(void *, int); -BIO_METHOD *BIO_s_file(void); -BIO *BIO_new_file(const char *, const char *); -BIO *BIO_new_fp(FILE *, int); -BIO_METHOD *BIO_s_fd(void); -BIO *BIO_new_fd(int, int); -BIO_METHOD *BIO_s_socket(void); -BIO *BIO_new_socket(int, int); -BIO_METHOD *BIO_s_null(void); -long BIO_ctrl(BIO *, int, long, void *); -long BIO_callback_ctrl( - BIO *, - int, - void (*)(struct bio_st *, int, const char *, int, long, long) -); -char *BIO_ptr_ctrl(BIO *, int, long); -long BIO_int_ctrl(BIO *, int, long, int); -size_t BIO_ctrl_pending(BIO *); -size_t BIO_ctrl_wpending(BIO *); -int BIO_read(BIO *, void *, int); -int BIO_gets(BIO *, char *, int); -int BIO_write(BIO *, const void *, int); -int BIO_puts(BIO *, const char *); -BIO_METHOD *BIO_f_null(void); -BIO_METHOD *BIO_f_buffer(void); -""" - -MACROS = """ -long BIO_set_fd(BIO *, long, int); -long BIO_get_fd(BIO *, char *); -long BIO_set_mem_eof_return(BIO *, int); -long BIO_get_mem_data(BIO *, char **); -long BIO_set_mem_buf(BIO *, BUF_MEM *, int); -long BIO_get_mem_ptr(BIO *, BUF_MEM **); -long BIO_set_fp(BIO *, FILE *, int); -long BIO_get_fp(BIO *, FILE **); -long BIO_read_filename(BIO *, char *); -long BIO_write_filename(BIO *, char *); -long BIO_append_filename(BIO *, char *); -long BIO_rw_filename(BIO *, char *); -int BIO_should_read(BIO *); -int BIO_should_write(BIO *); -int BIO_should_io_special(BIO *); -int BIO_retry_type(BIO *); -int BIO_should_retry(BIO *); -int BIO_reset(BIO *); -int BIO_seek(BIO *, int); -int BIO_tell(BIO *); -int BIO_flush(BIO *); -int BIO_eof(BIO *); -int BIO_set_close(BIO *,long); -int BIO_get_close(BIO *); -int BIO_pending(BIO *); -int BIO_wpending(BIO *); -int BIO_get_info_callback(BIO *, bio_info_cb **); -int BIO_set_info_callback(BIO *, bio_info_cb *); -long BIO_get_buffer_num_lines(BIO *); -long BIO_set_read_buffer_size(BIO *, long); -long BIO_set_write_buffer_size(BIO *, long); -long BIO_set_buffer_size(BIO *, long); -long BIO_set_buffer_read_data(BIO *, void *, long); - -/* The following was a macro in 0.9.8e. Once we drop support for RHEL/CentOS 5 - we should move this back to FUNCTIONS. */ -int BIO_method_type(const BIO *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cmac.py deleted file mode 100644 index c8bcc82..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cmac.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#if OPENSSL_VERSION_NUMBER >= 0x10001000L -#include -#endif -""" - -TYPES = """ -static const int Cryptography_HAS_CMAC; -typedef ... CMAC_CTX; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -CMAC_CTX *CMAC_CTX_new(void); -int CMAC_Init(CMAC_CTX *, const void *, size_t, const EVP_CIPHER *, ENGINE *); -int CMAC_Update(CMAC_CTX *, const void *, size_t); -int CMAC_Final(CMAC_CTX *, unsigned char *, size_t *); -int CMAC_CTX_copy(CMAC_CTX *, const CMAC_CTX *); -void CMAC_CTX_free(CMAC_CTX *); -""" - -CUSTOMIZATIONS = """ -#if OPENSSL_VERSION_NUMBER < 0x10001000L - -static const long Cryptography_HAS_CMAC = 0; -typedef void CMAC_CTX; -CMAC_CTX *(*CMAC_CTX_new)(void) = NULL; -int (*CMAC_Init)(CMAC_CTX *, const void *, size_t, const EVP_CIPHER *, - ENGINE *) = NULL; -int (*CMAC_Update)(CMAC_CTX *, const void *, size_t) = NULL; -int (*CMAC_Final)(CMAC_CTX *, unsigned char *, size_t *) = NULL; -int (*CMAC_CTX_copy)(CMAC_CTX *, const CMAC_CTX *) = NULL; -void (*CMAC_CTX_free)(CMAC_CTX *) = NULL; -#else -static const long Cryptography_HAS_CMAC = 1; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_CMAC": [ - "CMAC_CTX_new", - "CMAC_Init", - "CMAC_Update", - "CMAC_Final", - "CMAC_CTX_copy", - "CMAC_CTX_free", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cms.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cms.py deleted file mode 100644 index cbf4b28..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/cms.py +++ /dev/null @@ -1,100 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#if !defined(OPENSSL_NO_CMS) && OPENSSL_VERSION_NUMBER >= 0x0090808fL -/* The next define should really be in the OpenSSL header, but it is missing. - Failing to include this on Windows causes compilation failures. */ -#if defined(OPENSSL_SYS_WINDOWS) -#include -#endif -#include -#endif -""" - -TYPES = """ -static const long Cryptography_HAS_CMS; - -typedef ... CMS_ContentInfo; -typedef ... CMS_SignerInfo; -typedef ... CMS_CertificateChoices; -typedef ... CMS_RevocationInfoChoice; -typedef ... CMS_RecipientInfo; -typedef ... CMS_ReceiptRequest; -typedef ... CMS_Receipt; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -BIO *BIO_new_CMS(BIO *, CMS_ContentInfo *); -int i2d_CMS_bio_stream(BIO *, CMS_ContentInfo *, BIO *, int); -int PEM_write_bio_CMS_stream(BIO *, CMS_ContentInfo *, BIO *, int); -int CMS_final(CMS_ContentInfo *, BIO *, BIO *, unsigned int); -CMS_ContentInfo *CMS_sign(X509 *, EVP_PKEY *, Cryptography_STACK_OF_X509 *, - BIO *, unsigned int); -int CMS_verify(CMS_ContentInfo *, Cryptography_STACK_OF_X509 *, X509_STORE *, - BIO *, BIO *, unsigned int); -CMS_ContentInfo *CMS_encrypt(Cryptography_STACK_OF_X509 *, BIO *, - const EVP_CIPHER *, unsigned int); -int CMS_decrypt(CMS_ContentInfo *, EVP_PKEY *, X509 *, BIO *, BIO *, - unsigned int); -CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *, X509 *, EVP_PKEY *, - const EVP_MD *, unsigned int); -""" - -CUSTOMIZATIONS = """ -#if !defined(OPENSSL_NO_CMS) && OPENSSL_VERSION_NUMBER >= 0x0090808fL -static const long Cryptography_HAS_CMS = 1; -#else -static const long Cryptography_HAS_CMS = 0; -typedef void CMS_ContentInfo; -typedef void CMS_SignerInfo; -typedef void CMS_CertificateChoices; -typedef void CMS_RevocationInfoChoice; -typedef void CMS_RecipientInfo; -typedef void CMS_ReceiptRequest; -typedef void CMS_Receipt; -BIO *(*BIO_new_CMS)(BIO *, CMS_ContentInfo *) = NULL; -int (*i2d_CMS_bio_stream)(BIO *, CMS_ContentInfo *, BIO *, int) = NULL; -int (*PEM_write_bio_CMS_stream)(BIO *, CMS_ContentInfo *, BIO *, int) = NULL; -int (*CMS_final)(CMS_ContentInfo *, BIO *, BIO *, unsigned int) = NULL; -CMS_ContentInfo *(*CMS_sign)(X509 *, EVP_PKEY *, Cryptography_STACK_OF_X509 *, - BIO *, unsigned int) = NULL; -int (*CMS_verify)(CMS_ContentInfo *, Cryptography_STACK_OF_X509 *, - X509_STORE *, BIO *, BIO *, unsigned int) = NULL; -CMS_ContentInfo *(*CMS_encrypt)(Cryptography_STACK_OF_X509 *, BIO *, - const EVP_CIPHER *, unsigned int) = NULL; -int (*CMS_decrypt)(CMS_ContentInfo *, EVP_PKEY *, X509 *, BIO *, BIO *, - unsigned int) = NULL; -CMS_SignerInfo *(*CMS_add1_signer)(CMS_ContentInfo *, X509 *, EVP_PKEY *, - const EVP_MD *, unsigned int) = NULL; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_CMS": [ - "BIO_new_CMS", - "i2d_CMS_bio_stream", - "PEM_write_bio_CMS_stream", - "CMS_final", - "CMS_sign", - "CMS_verify", - "CMS_encrypt", - "CMS_decrypt", - "CMS_add1_signer", - ] -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/conf.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/conf.py deleted file mode 100644 index 001a070..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/conf.py +++ /dev/null @@ -1,35 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... CONF; -""" - -FUNCTIONS = """ -void OPENSSL_config(const char *); -void OPENSSL_no_config(void); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/crypto.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/crypto.py deleted file mode 100644 index 99e1a61..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/crypto.py +++ /dev/null @@ -1,67 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... CRYPTO_THREADID; - -static const int SSLEAY_VERSION; -static const int SSLEAY_CFLAGS; -static const int SSLEAY_PLATFORM; -static const int SSLEAY_DIR; -static const int SSLEAY_BUILT_ON; -static const int CRYPTO_MEM_CHECK_ON; -static const int CRYPTO_MEM_CHECK_OFF; -static const int CRYPTO_MEM_CHECK_ENABLE; -static const int CRYPTO_MEM_CHECK_DISABLE; -static const int CRYPTO_LOCK; -static const int CRYPTO_UNLOCK; -static const int CRYPTO_READ; -static const int CRYPTO_WRITE; -static const int CRYPTO_LOCK_SSL; -""" - -FUNCTIONS = """ -unsigned long SSLeay(void); -const char *SSLeay_version(int); - -void CRYPTO_free(void *); -int CRYPTO_mem_ctrl(int); -int CRYPTO_is_mem_check_on(void); -void CRYPTO_mem_leaks(struct bio_st *); -void CRYPTO_cleanup_all_ex_data(void); -int CRYPTO_num_locks(void); -void CRYPTO_set_locking_callback(void(*)(int, int, const char *, int)); -void CRYPTO_set_id_callback(unsigned long (*)(void)); -unsigned long (*CRYPTO_get_id_callback(void))(void); -void (*CRYPTO_get_locking_callback(void))(int, int, const char *, int); -void CRYPTO_lock(int, int, const char *, int); - -void OPENSSL_free(void *); -""" - -MACROS = """ -void CRYPTO_add(int *, int, int); -void CRYPTO_malloc_init(void); -void CRYPTO_malloc_debug_init(void); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dh.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dh.py deleted file mode 100644 index e2e8976..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dh.py +++ /dev/null @@ -1,57 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct dh_st { - /* Prime number (shared) */ - BIGNUM *p; - /* Generator of Z_p (shared) */ - BIGNUM *g; - /* Private DH value x */ - BIGNUM *priv_key; - /* Public DH value g^x */ - BIGNUM *pub_key; - ...; -} DH; -""" - -FUNCTIONS = """ -DH *DH_new(void); -void DH_free(DH *); -int DH_size(const DH *); -DH *DH_generate_parameters(int, int, void (*)(int, int, void *), void *); -int DH_check(const DH *, int *); -int DH_generate_key(DH *); -int DH_compute_key(unsigned char *, const BIGNUM *, DH *); -int DH_set_ex_data(DH *, int, void *); -void *DH_get_ex_data(DH *, int); -DH *d2i_DHparams(DH **, const unsigned char **, long); -int i2d_DHparams(const DH *, unsigned char **); -int DHparams_print_fp(FILE *, const DH *); -int DHparams_print(BIO *, const DH *); -""" - -MACROS = """ -int DH_generate_parameters_ex(DH *, int, int, BN_GENCB *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dsa.py deleted file mode 100644 index c9aa888..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/dsa.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct dsa_st { - /* Prime number (public) */ - BIGNUM *p; - /* Subprime (160-bit, q | p-1, public) */ - BIGNUM *q; - /* Generator of subgroup (public) */ - BIGNUM *g; - /* Private key x */ - BIGNUM *priv_key; - /* Public key y = g^x */ - BIGNUM *pub_key; - ...; -} DSA; -typedef struct { - BIGNUM *r; - BIGNUM *s; -} DSA_SIG; -""" - -FUNCTIONS = """ -DSA *DSA_generate_parameters(int, unsigned char *, int, int *, unsigned long *, - void (*)(int, int, void *), void *); -int DSA_generate_key(DSA *); -DSA *DSA_new(void); -void DSA_free(DSA *); -DSA_SIG *DSA_SIG_new(void); -void DSA_SIG_free(DSA_SIG *); -int i2d_DSA_SIG(const DSA_SIG *, unsigned char **); -DSA_SIG *d2i_DSA_SIG(DSA_SIG **, const unsigned char **, long); -int DSA_size(const DSA *); -int DSA_sign(int, const unsigned char *, int, unsigned char *, unsigned int *, - DSA *); -int DSA_verify(int, const unsigned char *, int, const unsigned char *, int, - DSA *); -""" - -MACROS = """ -int DSA_generate_parameters_ex(DSA *, int, unsigned char *, int, - int *, unsigned long *, BN_GENCB *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ec.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ec.py deleted file mode 100644 index 26fc8ff..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ec.py +++ /dev/null @@ -1,490 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#ifndef OPENSSL_NO_EC -#include -#endif - -#include -""" - -TYPES = """ -static const int Cryptography_HAS_EC; -static const int Cryptography_HAS_EC_1_0_1; -static const int Cryptography_HAS_EC_NISTP_64_GCC_128; -static const int Cryptography_HAS_EC2M; - -static const int OPENSSL_EC_NAMED_CURVE; - -typedef ... EC_KEY; -typedef ... EC_GROUP; -typedef ... EC_POINT; -typedef ... EC_METHOD; -typedef struct { - int nid; - const char *comment; -} EC_builtin_curve; -typedef enum { ... } point_conversion_form_t; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -EC_GROUP *EC_GROUP_new(const EC_METHOD *); -void EC_GROUP_free(EC_GROUP *); -void EC_GROUP_clear_free(EC_GROUP *); - -EC_GROUP *EC_GROUP_new_curve_GFp( - const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -EC_GROUP *EC_GROUP_new_curve_GF2m( - const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -EC_GROUP *EC_GROUP_new_by_curve_name(int); - -int EC_GROUP_set_curve_GFp( - EC_GROUP *, const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int EC_GROUP_get_curve_GFp( - const EC_GROUP *, BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *); -int EC_GROUP_set_curve_GF2m( - EC_GROUP *, const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -int EC_GROUP_get_curve_GF2m( - const EC_GROUP *, BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *); - -int EC_GROUP_get_degree(const EC_GROUP *); - -const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *); -const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *); -int EC_GROUP_get_curve_name(const EC_GROUP *); - -size_t EC_get_builtin_curves(EC_builtin_curve *, size_t); - -void EC_KEY_free(EC_KEY *); - -int EC_KEY_get_flags(const EC_KEY *); -void EC_KEY_set_flags(EC_KEY *, int); -void EC_KEY_clear_flags(EC_KEY *, int); -EC_KEY *EC_KEY_new_by_curve_name(int); -EC_KEY *EC_KEY_copy(EC_KEY *, const EC_KEY *); -EC_KEY *EC_KEY_dup(const EC_KEY *); -int EC_KEY_up_ref(EC_KEY *); -const EC_GROUP *EC_KEY_get0_group(const EC_KEY *); -int EC_GROUP_get_order(const EC_GROUP *, BIGNUM *, BN_CTX *); -int EC_KEY_set_group(EC_KEY *, const EC_GROUP *); -const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *); -int EC_KEY_set_private_key(EC_KEY *, const BIGNUM *); -const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *); -int EC_KEY_set_public_key(EC_KEY *, const EC_POINT *); -unsigned int EC_KEY_get_enc_flags(const EC_KEY *); -void EC_KEY_set_enc_flags(EC_KEY *eckey, unsigned int); -point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *); -void EC_KEY_set_conv_form(EC_KEY *, point_conversion_form_t); -void *EC_KEY_get_key_method_data( - EC_KEY *, - void *(*)(void *), - void (*)(void *), - void (*)(void *) -); -void EC_KEY_insert_key_method_data( - EC_KEY *, - void *, - void *(*)(void *), - void (*)(void *), - void (*)(void *) -); -void EC_KEY_set_asn1_flag(EC_KEY *, int); -int EC_KEY_precompute_mult(EC_KEY *, BN_CTX *); -int EC_KEY_generate_key(EC_KEY *); -int EC_KEY_check_key(const EC_KEY *); -int EC_KEY_set_public_key_affine_coordinates(EC_KEY *, BIGNUM *, BIGNUM *); - -EC_POINT *EC_POINT_new(const EC_GROUP *); -void EC_POINT_free(EC_POINT *); -void EC_POINT_clear_free(EC_POINT *); -int EC_POINT_copy(EC_POINT *, const EC_POINT *); -EC_POINT *EC_POINT_dup(const EC_POINT *, const EC_GROUP *); -const EC_METHOD *EC_POINT_method_of(const EC_POINT *); - -int EC_POINT_set_to_infinity(const EC_GROUP *, EC_POINT *); - -int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *, - const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); - -int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *, - const EC_POINT *, BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *); - -int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *, - const BIGNUM *, const BIGNUM *, BN_CTX *); - -int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, - const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *); - -int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *, - const BIGNUM *, int, BN_CTX *); - -int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *, EC_POINT *, - const BIGNUM *, const BIGNUM *, BN_CTX *); - -int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *, - const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *); - -int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *, EC_POINT *, - const BIGNUM *, int, BN_CTX *); - -size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t, - unsigned char *, size_t, BN_CTX *); - -int EC_POINT_oct2point(const EC_GROUP *, EC_POINT *, - const unsigned char *, size_t, BN_CTX *); - -BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t form, BIGNUM *, BN_CTX *); - -EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *, - EC_POINT *, BN_CTX *); - -char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t form, BN_CTX *); - -EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *, - EC_POINT *, BN_CTX *); - -int EC_POINT_add(const EC_GROUP *, EC_POINT *, const EC_POINT *, - const EC_POINT *, BN_CTX *); - -int EC_POINT_dbl(const EC_GROUP *, EC_POINT *, const EC_POINT *, BN_CTX *); -int EC_POINT_invert(const EC_GROUP *, EC_POINT *, BN_CTX *); -int EC_POINT_is_at_infinity(const EC_GROUP *, const EC_POINT *); -int EC_POINT_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *); - -int EC_POINT_cmp( - const EC_GROUP *, const EC_POINT *, const EC_POINT *, BN_CTX *); - -int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *); -int EC_POINTs_make_affine(const EC_GROUP *, size_t, EC_POINT *[], BN_CTX *); - -int EC_POINTs_mul( - const EC_GROUP *, EC_POINT *, const BIGNUM *, - size_t, const EC_POINT *[], const BIGNUM *[], BN_CTX *); - -int EC_POINT_mul(const EC_GROUP *, EC_POINT *, const BIGNUM *, - const EC_POINT *, const BIGNUM *, BN_CTX *); - -int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *); -int EC_GROUP_have_precompute_mult(const EC_GROUP *); - -const EC_METHOD *EC_GFp_simple_method(); -const EC_METHOD *EC_GFp_mont_method(); -const EC_METHOD *EC_GFp_nist_method(); - -const EC_METHOD *EC_GFp_nistp224_method(); -const EC_METHOD *EC_GFp_nistp256_method(); -const EC_METHOD *EC_GFp_nistp521_method(); - -const EC_METHOD *EC_GF2m_simple_method(); - -int EC_METHOD_get_field_type(const EC_METHOD *); -""" - -CUSTOMIZATIONS = """ -#ifdef OPENSSL_NO_EC -static const long Cryptography_HAS_EC = 0; - -typedef void EC_KEY; -typedef void EC_GROUP; -typedef void EC_POINT; -typedef void EC_METHOD; -typedef struct { - int nid; - const char *comment; -} EC_builtin_curve; -typedef long point_conversion_form_t; - -static const int OPENSSL_EC_NAMED_CURVE = 0; - -void (*EC_KEY_free)(EC_KEY *) = NULL; -size_t (*EC_get_builtin_curves)(EC_builtin_curve *, size_t) = NULL; -EC_KEY *(*EC_KEY_new_by_curve_name)(int) = NULL; -EC_KEY *(*EC_KEY_copy)(EC_KEY *, const EC_KEY *) = NULL; -EC_KEY *(*EC_KEY_dup)(const EC_KEY *) = NULL; -int (*EC_KEY_up_ref)(EC_KEY *) = NULL; -const EC_GROUP *(*EC_KEY_get0_group)(const EC_KEY *) = NULL; -int (*EC_GROUP_get_order)(const EC_GROUP *, BIGNUM *, BN_CTX *) = NULL; -int (*EC_KEY_set_group)(EC_KEY *, const EC_GROUP *) = NULL; -const BIGNUM *(*EC_KEY_get0_private_key)(const EC_KEY *) = NULL; -int (*EC_KEY_set_private_key)(EC_KEY *, const BIGNUM *) = NULL; -const EC_POINT *(*EC_KEY_get0_public_key)(const EC_KEY *) = NULL; -int (*EC_KEY_set_public_key)(EC_KEY *, const EC_POINT *) = NULL; -unsigned int (*EC_KEY_get_enc_flags)(const EC_KEY *) = NULL; -void (*EC_KEY_set_enc_flags)(EC_KEY *eckey, unsigned int) = NULL; -point_conversion_form_t (*EC_KEY_get_conv_form)(const EC_KEY *) = NULL; -void (*EC_KEY_set_conv_form)(EC_KEY *, point_conversion_form_t) = NULL; -void *(*EC_KEY_get_key_method_data)( - EC_KEY *, void *(*)(void *), void (*)(void *), void (*)(void *)) = NULL; -void (*EC_KEY_insert_key_method_data)( - EC_KEY *, void *, - void *(*)(void *), void (*)(void *), void (*)(void *)) = NULL; -void (*EC_KEY_set_asn1_flag)(EC_KEY *, int) = NULL; -int (*EC_KEY_precompute_mult)(EC_KEY *, BN_CTX *) = NULL; -int (*EC_KEY_generate_key)(EC_KEY *) = NULL; -int (*EC_KEY_check_key)(const EC_KEY *) = NULL; - -EC_GROUP *(*EC_GROUP_new)(const EC_METHOD *); -void (*EC_GROUP_free)(EC_GROUP *); -void (*EC_GROUP_clear_free)(EC_GROUP *); - -EC_GROUP *(*EC_GROUP_new_curve_GFp)( - const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); - -EC_GROUP *(*EC_GROUP_new_by_curve_name)(int); - -int (*EC_GROUP_set_curve_GFp)( - EC_GROUP *, const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); - -int (*EC_GROUP_get_curve_GFp)( - const EC_GROUP *, BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *); - -int (*EC_GROUP_get_degree)(const EC_GROUP *) = NULL; - -const EC_METHOD *(*EC_GROUP_method_of)(const EC_GROUP *) = NULL; -const EC_POINT *(*EC_GROUP_get0_generator)(const EC_GROUP *) = NULL; -int (*EC_GROUP_get_curve_name)(const EC_GROUP *) = NULL; - -EC_POINT *(*EC_POINT_new)(const EC_GROUP *) = NULL; -void (*EC_POINT_free)(EC_POINT *) = NULL; -void (*EC_POINT_clear_free)(EC_POINT *) = NULL; -int (*EC_POINT_copy)(EC_POINT *, const EC_POINT *) = NULL; -EC_POINT *(*EC_POINT_dup)(const EC_POINT *, const EC_GROUP *) = NULL; -const EC_METHOD *(*EC_POINT_method_of)(const EC_POINT *) = NULL; -int (*EC_POINT_set_to_infinity)(const EC_GROUP *, EC_POINT *) = NULL; -int (*EC_POINT_set_Jprojective_coordinates_GFp)(const EC_GROUP *, EC_POINT *, - const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *) = NULL; - -int (*EC_POINT_get_Jprojective_coordinates_GFp)(const EC_GROUP *, - const EC_POINT *, BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *) = NULL; - -int (*EC_POINT_set_affine_coordinates_GFp)(const EC_GROUP *, EC_POINT *, - const BIGNUM *, const BIGNUM *, BN_CTX *) = NULL; - -int (*EC_POINT_get_affine_coordinates_GFp)(const EC_GROUP *, - const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *) = NULL; - -int (*EC_POINT_set_compressed_coordinates_GFp)(const EC_GROUP *, EC_POINT *, - const BIGNUM *, int, BN_CTX *) = NULL; - -size_t (*EC_POINT_point2oct)(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t, - unsigned char *, size_t, BN_CTX *) = NULL; - -int (*EC_POINT_oct2point)(const EC_GROUP *, EC_POINT *, - const unsigned char *, size_t, BN_CTX *) = NULL; - -BIGNUM *(*EC_POINT_point2bn)(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t form, BIGNUM *, BN_CTX *) = NULL; - -EC_POINT *(*EC_POINT_bn2point)(const EC_GROUP *, const BIGNUM *, - EC_POINT *, BN_CTX *) = NULL; - -char *(*EC_POINT_point2hex)(const EC_GROUP *, const EC_POINT *, - point_conversion_form_t form, BN_CTX *) = NULL; - -EC_POINT *(*EC_POINT_hex2point)(const EC_GROUP *, const char *, - EC_POINT *, BN_CTX *) = NULL; - -int (*EC_POINT_add)(const EC_GROUP *, EC_POINT *, const EC_POINT *, - const EC_POINT *, BN_CTX *) = NULL; - -int (*EC_POINT_dbl)(const EC_GROUP *, EC_POINT *, const EC_POINT *, - BN_CTX *) = NULL; - -int (*EC_POINT_invert)(const EC_GROUP *, EC_POINT *, BN_CTX *) = NULL; -int (*EC_POINT_is_at_infinity)(const EC_GROUP *, const EC_POINT *) = NULL; - -int (*EC_POINT_is_on_curve)(const EC_GROUP *, const EC_POINT *, - BN_CTX *) = NULL; - -int (*EC_POINT_cmp)( - const EC_GROUP *, const EC_POINT *, const EC_POINT *, BN_CTX *) = NULL; - -int (*EC_POINT_make_affine)(const EC_GROUP *, EC_POINT *, BN_CTX *) = NULL; - -int (*EC_POINTs_make_affine)(const EC_GROUP *, size_t, EC_POINT *[], - BN_CTX *) = NULL; - -int (*EC_POINTs_mul)( - const EC_GROUP *, EC_POINT *, const BIGNUM *, - size_t, const EC_POINT *[], const BIGNUM *[], BN_CTX *) = NULL; - -int (*EC_POINT_mul)(const EC_GROUP *, EC_POINT *, const BIGNUM *, - const EC_POINT *, const BIGNUM *, BN_CTX *) = NULL; - -int (*EC_GROUP_precompute_mult)(EC_GROUP *, BN_CTX *) = NULL; -int (*EC_GROUP_have_precompute_mult)(const EC_GROUP *) = NULL; - -const EC_METHOD *(*EC_GFp_simple_method)() = NULL; -const EC_METHOD *(*EC_GFp_mont_method)() = NULL; -const EC_METHOD *(*EC_GFp_nist_method)() = NULL; - -int (*EC_METHOD_get_field_type)(const EC_METHOD *) = NULL; - -#else -static const long Cryptography_HAS_EC = 1; -#endif - -#if defined(OPENSSL_NO_EC) || OPENSSL_VERSION_NUMBER < 0x1000100f -static const long Cryptography_HAS_EC_1_0_1 = 0; - -int (*EC_KEY_get_flags)(const EC_KEY *) = NULL; -void (*EC_KEY_set_flags)(EC_KEY *, int) = NULL; -void (*EC_KEY_clear_flags)(EC_KEY *, int) = NULL; - -int (*EC_KEY_set_public_key_affine_coordinates)( - EC_KEY *, BIGNUM *, BIGNUM *) = NULL; -#else -static const long Cryptography_HAS_EC_1_0_1 = 1; -#endif - - -#if defined(OPENSSL_NO_EC) || OPENSSL_VERSION_NUMBER < 0x1000100f || \ - defined(OPENSSL_NO_EC_NISTP_64_GCC_128) -static const long Cryptography_HAS_EC_NISTP_64_GCC_128 = 0; - -const EC_METHOD *(*EC_GFp_nistp224_method)(void) = NULL; -const EC_METHOD *(*EC_GFp_nistp256_method)(void) = NULL; -const EC_METHOD *(*EC_GFp_nistp521_method)(void) = NULL; -#else -static const long Cryptography_HAS_EC_NISTP_64_GCC_128 = 1; -#endif - -#if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_EC2M) -static const long Cryptography_HAS_EC2M = 0; - -const EC_METHOD *(*EC_GF2m_simple_method)() = NULL; - -int (*EC_POINT_set_affine_coordinates_GF2m)(const EC_GROUP *, EC_POINT *, - const BIGNUM *, const BIGNUM *, BN_CTX *) = NULL; - -int (*EC_POINT_get_affine_coordinates_GF2m)(const EC_GROUP *, - const EC_POINT *, BIGNUM *, BIGNUM *, BN_CTX *) = NULL; - -int (*EC_POINT_set_compressed_coordinates_GF2m)(const EC_GROUP *, EC_POINT *, - const BIGNUM *, int, BN_CTX *) = NULL; - -int (*EC_GROUP_set_curve_GF2m)( - EC_GROUP *, const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); - -int (*EC_GROUP_get_curve_GF2m)( - const EC_GROUP *, BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *); - -EC_GROUP *(*EC_GROUP_new_curve_GF2m)( - const BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); -#else -static const long Cryptography_HAS_EC2M = 1; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_EC": [ - "OPENSSL_EC_NAMED_CURVE", - "EC_GROUP_new", - "EC_GROUP_free", - "EC_GROUP_clear_free", - "EC_GROUP_new_curve_GFp", - "EC_GROUP_new_by_curve_name", - "EC_GROUP_set_curve_GFp", - "EC_GROUP_get_curve_GFp", - "EC_GROUP_method_of", - "EC_GROUP_get0_generator", - "EC_GROUP_get_curve_name", - "EC_GROUP_get_degree", - "EC_KEY_free", - "EC_get_builtin_curves", - "EC_KEY_new_by_curve_name", - "EC_KEY_copy", - "EC_KEY_dup", - "EC_KEY_up_ref", - "EC_KEY_set_group", - "EC_KEY_get0_private_key", - "EC_KEY_set_private_key", - "EC_KEY_set_public_key", - "EC_KEY_get_enc_flags", - "EC_KEY_set_enc_flags", - "EC_KEY_set_conv_form", - "EC_KEY_get_key_method_data", - "EC_KEY_insert_key_method_data", - "EC_KEY_set_asn1_flag", - "EC_KEY_precompute_mult", - "EC_KEY_generate_key", - "EC_KEY_check_key", - "EC_POINT_new", - "EC_POINT_free", - "EC_POINT_clear_free", - "EC_POINT_copy", - "EC_POINT_dup", - "EC_POINT_method_of", - "EC_POINT_set_to_infinity", - "EC_POINT_set_Jprojective_coordinates_GFp", - "EC_POINT_get_Jprojective_coordinates_GFp", - "EC_POINT_set_affine_coordinates_GFp", - "EC_POINT_get_affine_coordinates_GFp", - "EC_POINT_set_compressed_coordinates_GFp", - "EC_POINT_point2oct", - "EC_POINT_oct2point", - "EC_POINT_point2bn", - "EC_POINT_bn2point", - "EC_POINT_point2hex", - "EC_POINT_hex2point", - "EC_POINT_add", - "EC_POINT_dbl", - "EC_POINT_invert", - "EC_POINT_is_at_infinity", - "EC_POINT_is_on_curve", - "EC_POINT_cmp", - "EC_POINT_make_affine", - "EC_POINTs_make_affine", - "EC_POINTs_mul", - "EC_POINT_mul", - "EC_GROUP_precompute_mult", - "EC_GROUP_have_precompute_mult", - "EC_GFp_simple_method", - "EC_GFp_mont_method", - "EC_GFp_nist_method", - "EC_METHOD_get_field_type", - ], - - "Cryptography_HAS_EC_1_0_1": [ - "EC_KEY_get_flags", - "EC_KEY_set_flags", - "EC_KEY_clear_flags", - "EC_KEY_set_public_key_affine_coordinates", - ], - - "Cryptography_HAS_EC_NISTP_64_GCC_128": [ - "EC_GFp_nistp224_method", - "EC_GFp_nistp256_method", - "EC_GFp_nistp521_method", - ], - - "Cryptography_HAS_EC2M": [ - "EC_GF2m_simple_method", - "EC_POINT_set_affine_coordinates_GF2m", - "EC_POINT_get_affine_coordinates_GF2m", - "EC_POINT_set_compressed_coordinates_GF2m", - "EC_GROUP_set_curve_GF2m", - "EC_GROUP_get_curve_GF2m", - "EC_GROUP_new_curve_GF2m", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdh.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdh.py deleted file mode 100644 index 960d46f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdh.py +++ /dev/null @@ -1,68 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#ifndef OPENSSL_NO_ECDH -#include -#endif -""" - -TYPES = """ -static const int Cryptography_HAS_ECDH; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -int ECDH_compute_key(void *, size_t, const EC_POINT *, EC_KEY *, - void *(*)(const void *, size_t, void *, size_t *)); - -int ECDH_get_ex_new_index(long, void *, CRYPTO_EX_new *, CRYPTO_EX_dup *, - CRYPTO_EX_free *); - -int ECDH_set_ex_data(EC_KEY *, int, void *); - -void *ECDH_get_ex_data(EC_KEY *, int); -""" - -CUSTOMIZATIONS = """ -#ifdef OPENSSL_NO_ECDH -static const long Cryptography_HAS_ECDH = 0; - -int (*ECDH_compute_key)(void *, size_t, const EC_POINT *, EC_KEY *, - void *(*)(const void *, size_t, void *, - size_t *)) = NULL; - -int (*ECDH_get_ex_new_index)(long, void *, CRYPTO_EX_new *, CRYPTO_EX_dup *, - CRYPTO_EX_free *) = NULL; - -int (*ECDH_set_ex_data)(EC_KEY *, int, void *) = NULL; - -void *(*ECDH_get_ex_data)(EC_KEY *, int) = NULL; - -#else -static const long Cryptography_HAS_ECDH = 1; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_ECDH": [ - "ECDH_compute_key", - "ECDH_get_ex_new_index", - "ECDH_set_ex_data", - "ECDH_get_ex_data", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdsa.py deleted file mode 100644 index bfa6720..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ecdsa.py +++ /dev/null @@ -1,130 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#ifndef OPENSSL_NO_ECDSA -#include -#endif -""" - -TYPES = """ -static const int Cryptography_HAS_ECDSA; - -typedef struct { - BIGNUM *r; - BIGNUM *s; -} ECDSA_SIG; - -typedef ... CRYPTO_EX_new; -typedef ... CRYPTO_EX_dup; -typedef ... CRYPTO_EX_free; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -ECDSA_SIG *ECDSA_SIG_new(); -void ECDSA_SIG_free(ECDSA_SIG *); -int i2d_ECDSA_SIG(const ECDSA_SIG *, unsigned char **); -ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **s, const unsigned char **, long); -ECDSA_SIG *ECDSA_do_sign(const unsigned char *, int, EC_KEY *); -ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *, int, const BIGNUM *, - const BIGNUM *, EC_KEY *); -int ECDSA_do_verify(const unsigned char *, int, const ECDSA_SIG *, EC_KEY*); -int ECDSA_sign_setup(EC_KEY *, BN_CTX *, BIGNUM **, BIGNUM **); -int ECDSA_sign(int, const unsigned char *, int, unsigned char *, - unsigned int *, EC_KEY *); -int ECDSA_sign_ex(int, const unsigned char *, int dgstlen, unsigned char *, - unsigned int *, const BIGNUM *, const BIGNUM *, EC_KEY *); -int ECDSA_verify(int, const unsigned char *, int, const unsigned char *, int, - EC_KEY *); -int ECDSA_size(const EC_KEY *); - -const ECDSA_METHOD* ECDSA_OpenSSL(); -void ECDSA_set_default_method(const ECDSA_METHOD *); -const ECDSA_METHOD* ECDSA_get_default_method(); -int ECDSA_get_ex_new_index(long, void *, CRYPTO_EX_new *, - CRYPTO_EX_dup *, CRYPTO_EX_free *); -int ECDSA_set_method(EC_KEY *, const ECDSA_METHOD *); -int ECDSA_set_ex_data(EC_KEY *, int, void *); -void *ECDSA_get_ex_data(EC_KEY *, int); -""" - -CUSTOMIZATIONS = """ -#ifdef OPENSSL_NO_ECDSA -static const long Cryptography_HAS_ECDSA = 0; - -typedef struct { - BIGNUM *r; - BIGNUM *s; -} ECDSA_SIG; - -ECDSA_SIG* (*ECDSA_SIG_new)() = NULL; -void (*ECDSA_SIG_free)(ECDSA_SIG *) = NULL; -int (*i2d_ECDSA_SIG)(const ECDSA_SIG *, unsigned char **) = NULL; -ECDSA_SIG* (*d2i_ECDSA_SIG)(ECDSA_SIG **s, const unsigned char **, - long) = NULL; -ECDSA_SIG* (*ECDSA_do_sign)(const unsigned char *, int, EC_KEY *eckey) = NULL; -ECDSA_SIG* (*ECDSA_do_sign_ex)(const unsigned char *, int, const BIGNUM *, - const BIGNUM *, EC_KEY *) = NULL; -int (*ECDSA_do_verify)(const unsigned char *, int, const ECDSA_SIG *, - EC_KEY*) = NULL; -int (*ECDSA_sign_setup)(EC_KEY *, BN_CTX *, BIGNUM **, BIGNUM **) = NULL; -int (*ECDSA_sign)(int, const unsigned char *, int, unsigned char *, - unsigned int *, EC_KEY *) = NULL; -int (*ECDSA_sign_ex)(int, const unsigned char *, int dgstlen, unsigned char *, - unsigned int *, const BIGNUM *, const BIGNUM *, - EC_KEY *) = NULL; -int (*ECDSA_verify)(int, const unsigned char *, int, const unsigned char *, - int, EC_KEY *) = NULL; -int (*ECDSA_size)(const EC_KEY *) = NULL; - -const ECDSA_METHOD* (*ECDSA_OpenSSL)() = NULL; -void (*ECDSA_set_default_method)(const ECDSA_METHOD *) = NULL; -const ECDSA_METHOD* (*ECDSA_get_default_method)() = NULL; -int (*ECDSA_set_method)(EC_KEY *, const ECDSA_METHOD *) = NULL; -int (*ECDSA_get_ex_new_index)(long, void *, CRYPTO_EX_new *, - CRYPTO_EX_dup *, CRYPTO_EX_free *) = NULL; -int (*ECDSA_set_ex_data)(EC_KEY *, int, void *) = NULL; -void* (*ECDSA_get_ex_data)(EC_KEY *, int) = NULL; -#else -static const long Cryptography_HAS_ECDSA = 1; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_ECDSA": [ - "ECDSA_SIG_new", - "ECDSA_SIG_free", - "i2d_ECDSA_SIG", - "d2i_ECDSA_SIG", - "ECDSA_do_sign", - "ECDSA_do_sign_ex", - "ECDSA_do_verify", - "ECDSA_sign_setup", - "ECDSA_sign", - "ECDSA_sign_ex", - "ECDSA_verify", - "ECDSA_size", - "ECDSA_OpenSSL", - "ECDSA_set_default_method", - "ECDSA_get_default_method", - "ECDSA_set_method", - "ECDSA_get_ex_new_index", - "ECDSA_set_ex_data", - "ECDSA_get_ex_data", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/engine.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/engine.py deleted file mode 100644 index 364232e..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/engine.py +++ /dev/null @@ -1,165 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... ENGINE; -typedef ... RSA_METHOD; -typedef ... DSA_METHOD; -typedef ... ECDH_METHOD; -typedef ... ECDSA_METHOD; -typedef ... DH_METHOD; -typedef ... RAND_METHOD; -typedef ... STORE_METHOD; -typedef ... *ENGINE_GEN_INT_FUNC_PTR; -typedef ... *ENGINE_CTRL_FUNC_PTR; -typedef ... *ENGINE_LOAD_KEY_PTR; -typedef ... *ENGINE_CIPHERS_PTR; -typedef ... *ENGINE_DIGESTS_PTR; -typedef ... ENGINE_CMD_DEFN; -typedef ... UI_METHOD; - -static const unsigned int ENGINE_METHOD_RSA; -static const unsigned int ENGINE_METHOD_DSA; -static const unsigned int ENGINE_METHOD_RAND; -static const unsigned int ENGINE_METHOD_ECDH; -static const unsigned int ENGINE_METHOD_ECDSA; -static const unsigned int ENGINE_METHOD_CIPHERS; -static const unsigned int ENGINE_METHOD_DIGESTS; -static const unsigned int ENGINE_METHOD_STORE; -static const unsigned int ENGINE_METHOD_ALL; -static const unsigned int ENGINE_METHOD_NONE; -""" - -FUNCTIONS = """ -ENGINE *ENGINE_get_first(void); -ENGINE *ENGINE_get_last(void); -ENGINE *ENGINE_get_next(ENGINE *); -ENGINE *ENGINE_get_prev(ENGINE *); -int ENGINE_add(ENGINE *); -int ENGINE_remove(ENGINE *); -ENGINE *ENGINE_by_id(const char *); -int ENGINE_init(ENGINE *); -int ENGINE_finish(ENGINE *); -void ENGINE_load_openssl(void); -void ENGINE_load_dynamic(void); -void ENGINE_load_cryptodev(void); -void ENGINE_load_builtin_engines(void); -void ENGINE_cleanup(void); -ENGINE *ENGINE_get_default_RSA(void); -ENGINE *ENGINE_get_default_DSA(void); -ENGINE *ENGINE_get_default_ECDH(void); -ENGINE *ENGINE_get_default_ECDSA(void); -ENGINE *ENGINE_get_default_DH(void); -ENGINE *ENGINE_get_default_RAND(void); -ENGINE *ENGINE_get_cipher_engine(int); -ENGINE *ENGINE_get_digest_engine(int); -int ENGINE_set_default_RSA(ENGINE *); -int ENGINE_set_default_DSA(ENGINE *); -int ENGINE_set_default_ECDH(ENGINE *); -int ENGINE_set_default_ECDSA(ENGINE *); -int ENGINE_set_default_DH(ENGINE *); -int ENGINE_set_default_RAND(ENGINE *); -int ENGINE_set_default_ciphers(ENGINE *); -int ENGINE_set_default_digests(ENGINE *); -int ENGINE_set_default_string(ENGINE *, const char *); -int ENGINE_set_default(ENGINE *, unsigned int); -unsigned int ENGINE_get_table_flags(void); -void ENGINE_set_table_flags(unsigned int); -int ENGINE_register_RSA(ENGINE *); -void ENGINE_unregister_RSA(ENGINE *); -void ENGINE_register_all_RSA(void); -int ENGINE_register_DSA(ENGINE *); -void ENGINE_unregister_DSA(ENGINE *); -void ENGINE_register_all_DSA(void); -int ENGINE_register_ECDH(ENGINE *); -void ENGINE_unregister_ECDH(ENGINE *); -void ENGINE_register_all_ECDH(void); -int ENGINE_register_ECDSA(ENGINE *); -void ENGINE_unregister_ECDSA(ENGINE *); -void ENGINE_register_all_ECDSA(void); -int ENGINE_register_DH(ENGINE *); -void ENGINE_unregister_DH(ENGINE *); -void ENGINE_register_all_DH(void); -int ENGINE_register_RAND(ENGINE *); -void ENGINE_unregister_RAND(ENGINE *); -void ENGINE_register_all_RAND(void); -int ENGINE_register_STORE(ENGINE *); -void ENGINE_unregister_STORE(ENGINE *); -void ENGINE_register_all_STORE(void); -int ENGINE_register_ciphers(ENGINE *); -void ENGINE_unregister_ciphers(ENGINE *); -void ENGINE_register_all_ciphers(void); -int ENGINE_register_digests(ENGINE *); -void ENGINE_unregister_digests(ENGINE *); -void ENGINE_register_all_digests(void); -int ENGINE_register_complete(ENGINE *); -int ENGINE_register_all_complete(void); -int ENGINE_ctrl(ENGINE *, int, long, void *, void (*)(void)); -int ENGINE_cmd_is_executable(ENGINE *, int); -int ENGINE_ctrl_cmd(ENGINE *, const char *, long, void *, void (*)(void), int); -int ENGINE_ctrl_cmd_string(ENGINE *, const char *, const char *, int); - -ENGINE *ENGINE_new(void); -int ENGINE_free(ENGINE *); -int ENGINE_up_ref(ENGINE *); -int ENGINE_set_id(ENGINE *, const char *); -int ENGINE_set_name(ENGINE *, const char *); -int ENGINE_set_RSA(ENGINE *, const RSA_METHOD *); -int ENGINE_set_DSA(ENGINE *, const DSA_METHOD *); -int ENGINE_set_ECDH(ENGINE *, const ECDH_METHOD *); -int ENGINE_set_ECDSA(ENGINE *, const ECDSA_METHOD *); -int ENGINE_set_DH(ENGINE *, const DH_METHOD *); -int ENGINE_set_RAND(ENGINE *, const RAND_METHOD *); -int ENGINE_set_STORE(ENGINE *, const STORE_METHOD *); -int ENGINE_set_destroy_function(ENGINE *, ENGINE_GEN_INT_FUNC_PTR); -int ENGINE_set_init_function(ENGINE *, ENGINE_GEN_INT_FUNC_PTR); -int ENGINE_set_finish_function(ENGINE *, ENGINE_GEN_INT_FUNC_PTR); -int ENGINE_set_ctrl_function(ENGINE *, ENGINE_CTRL_FUNC_PTR); -int ENGINE_set_load_privkey_function(ENGINE *, ENGINE_LOAD_KEY_PTR); -int ENGINE_set_load_pubkey_function(ENGINE *, ENGINE_LOAD_KEY_PTR); -int ENGINE_set_ciphers(ENGINE *, ENGINE_CIPHERS_PTR); -int ENGINE_set_digests(ENGINE *, ENGINE_DIGESTS_PTR); -int ENGINE_set_flags(ENGINE *, int); -int ENGINE_set_cmd_defns(ENGINE *, const ENGINE_CMD_DEFN *); -const char *ENGINE_get_id(const ENGINE *); -const char *ENGINE_get_name(const ENGINE *); -const RSA_METHOD *ENGINE_get_RSA(const ENGINE *); -const DSA_METHOD *ENGINE_get_DSA(const ENGINE *); -const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *); -const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *); -const DH_METHOD *ENGINE_get_DH(const ENGINE *); -const RAND_METHOD *ENGINE_get_RAND(const ENGINE *); -const STORE_METHOD *ENGINE_get_STORE(const ENGINE *); - -const EVP_CIPHER *ENGINE_get_cipher(ENGINE *, int); -const EVP_MD *ENGINE_get_digest(ENGINE *, int); -int ENGINE_get_flags(const ENGINE *); -const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *); -EVP_PKEY *ENGINE_load_private_key(ENGINE *, const char *, UI_METHOD *, void *); -EVP_PKEY *ENGINE_load_public_key(ENGINE *, const char *, UI_METHOD *, void *); -void ENGINE_add_conf_module(void); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/err.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/err.py deleted file mode 100644 index 232060a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/err.py +++ /dev/null @@ -1,347 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -static const int Cryptography_HAS_REMOVE_THREAD_STATE; -static const int Cryptography_HAS_098H_ERROR_CODES; -static const int Cryptography_HAS_098C_CAMELLIA_CODES; -static const int Cryptography_HAS_EC_CODES; - -struct ERR_string_data_st { - unsigned long error; - const char *string; -}; -typedef struct ERR_string_data_st ERR_STRING_DATA; - -static const int ERR_LIB_EVP; -static const int ERR_LIB_EC; -static const int ERR_LIB_PEM; -static const int ERR_LIB_ASN1; -static const int ERR_LIB_RSA; - -static const int ASN1_F_ASN1_ENUMERATED_TO_BN; -static const int ASN1_F_ASN1_EX_C2I; -static const int ASN1_F_ASN1_FIND_END; -static const int ASN1_F_ASN1_GENERALIZEDTIME_SET; -static const int ASN1_F_ASN1_GENERATE_V3; -static const int ASN1_F_ASN1_GET_OBJECT; -static const int ASN1_F_ASN1_ITEM_I2D_FP; -static const int ASN1_F_ASN1_ITEM_PACK; -static const int ASN1_F_ASN1_ITEM_SIGN; -static const int ASN1_F_ASN1_ITEM_UNPACK; -static const int ASN1_F_ASN1_ITEM_VERIFY; -static const int ASN1_F_ASN1_MBSTRING_NCOPY; -static const int ASN1_F_ASN1_TEMPLATE_EX_D2I; -static const int ASN1_F_ASN1_TEMPLATE_NEW; -static const int ASN1_F_ASN1_TEMPLATE_NOEXP_D2I; -static const int ASN1_F_ASN1_TIME_SET; -static const int ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING; -static const int ASN1_F_ASN1_TYPE_GET_OCTETSTRING; -static const int ASN1_F_ASN1_UNPACK_STRING; -static const int ASN1_F_ASN1_UTCTIME_SET; -static const int ASN1_F_ASN1_VERIFY; -static const int ASN1_F_BITSTR_CB; -static const int ASN1_F_BN_TO_ASN1_ENUMERATED; -static const int ASN1_F_BN_TO_ASN1_INTEGER; -static const int ASN1_F_D2I_ASN1_TYPE_BYTES; -static const int ASN1_F_D2I_ASN1_UINTEGER; -static const int ASN1_F_D2I_ASN1_UTCTIME; -static const int ASN1_F_D2I_NETSCAPE_RSA; -static const int ASN1_F_D2I_NETSCAPE_RSA_2; -static const int ASN1_F_D2I_PRIVATEKEY; -static const int ASN1_F_D2I_X509; -static const int ASN1_F_D2I_X509_CINF; -static const int ASN1_F_D2I_X509_PKEY; -static const int ASN1_F_I2D_ASN1_SET; -static const int ASN1_F_I2D_ASN1_TIME; -static const int ASN1_F_I2D_DSA_PUBKEY; -static const int ASN1_F_LONG_C2I; -static const int ASN1_F_OID_MODULE_INIT; -static const int ASN1_F_PARSE_TAGGING; -static const int ASN1_F_PKCS5_PBE_SET; -static const int ASN1_F_X509_CINF_NEW; -static const int ASN1_R_BOOLEAN_IS_WRONG_LENGTH; -static const int ASN1_R_BUFFER_TOO_SMALL; -static const int ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER; -static const int ASN1_R_DATA_IS_WRONG; -static const int ASN1_R_DECODE_ERROR; -static const int ASN1_R_DECODING_ERROR; -static const int ASN1_R_DEPTH_EXCEEDED; -static const int ASN1_R_ENCODE_ERROR; -static const int ASN1_R_ERROR_GETTING_TIME; -static const int ASN1_R_ERROR_LOADING_SECTION; -static const int ASN1_R_MSTRING_WRONG_TAG; -static const int ASN1_R_NESTED_ASN1_STRING; -static const int ASN1_R_NO_MATCHING_CHOICE_TYPE; -static const int ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM; -static const int ASN1_R_UNKNOWN_OBJECT_TYPE; -static const int ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE; -static const int ASN1_R_UNKNOWN_TAG; -static const int ASN1_R_UNKOWN_FORMAT; -static const int ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE; -static const int ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM; -static const int ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE; -static const int ASN1_R_UNSUPPORTED_TYPE; -static const int ASN1_R_WRONG_TAG; -static const int ASN1_R_WRONG_TYPE; - -static const int EVP_F_AES_INIT_KEY; -static const int EVP_F_D2I_PKEY; -static const int EVP_F_DSA_PKEY2PKCS8; -static const int EVP_F_DSAPKEY2PKCS8; -static const int EVP_F_ECDSA_PKEY2PKCS8; -static const int EVP_F_ECKEY_PKEY2PKCS8; -static const int EVP_F_EVP_CIPHER_CTX_CTRL; -static const int EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH; -static const int EVP_F_EVP_CIPHERINIT_EX; -static const int EVP_F_EVP_DECRYPTFINAL_EX; -static const int EVP_F_EVP_DIGESTINIT_EX; -static const int EVP_F_EVP_ENCRYPTFINAL_EX; -static const int EVP_F_EVP_MD_CTX_COPY_EX; -static const int EVP_F_EVP_OPENINIT; -static const int EVP_F_EVP_PBE_ALG_ADD; -static const int EVP_F_EVP_PBE_CIPHERINIT; -static const int EVP_F_EVP_PKCS82PKEY; -static const int EVP_F_EVP_PKEY2PKCS8_BROKEN; -static const int EVP_F_EVP_PKEY_COPY_PARAMETERS; -static const int EVP_F_EVP_PKEY_DECRYPT; -static const int EVP_F_EVP_PKEY_ENCRYPT; -static const int EVP_F_EVP_PKEY_GET1_DH; -static const int EVP_F_EVP_PKEY_GET1_DSA; -static const int EVP_F_EVP_PKEY_GET1_ECDSA; -static const int EVP_F_EVP_PKEY_GET1_EC_KEY; -static const int EVP_F_EVP_PKEY_GET1_RSA; -static const int EVP_F_EVP_PKEY_NEW; -static const int EVP_F_EVP_RIJNDAEL; -static const int EVP_F_EVP_SIGNFINAL; -static const int EVP_F_EVP_VERIFYFINAL; -static const int EVP_F_PKCS5_PBE_KEYIVGEN; -static const int EVP_F_PKCS5_V2_PBE_KEYIVGEN; -static const int EVP_F_PKCS8_SET_BROKEN; -static const int EVP_F_RC2_MAGIC_TO_METH; -static const int EVP_F_RC5_CTRL; - -static const int EVP_R_AES_KEY_SETUP_FAILED; -static const int EVP_R_ASN1_LIB; -static const int EVP_R_BAD_BLOCK_LENGTH; -static const int EVP_R_BAD_DECRYPT; -static const int EVP_R_BAD_KEY_LENGTH; -static const int EVP_R_BN_DECODE_ERROR; -static const int EVP_R_BN_PUBKEY_ERROR; -static const int EVP_R_CIPHER_PARAMETER_ERROR; -static const int EVP_R_CTRL_NOT_IMPLEMENTED; -static const int EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED; -static const int EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH; -static const int EVP_R_DECODE_ERROR; -static const int EVP_R_DIFFERENT_KEY_TYPES; -static const int EVP_R_ENCODE_ERROR; -static const int EVP_R_INITIALIZATION_ERROR; -static const int EVP_R_INPUT_NOT_INITIALIZED; -static const int EVP_R_INVALID_KEY_LENGTH; -static const int EVP_R_IV_TOO_LARGE; -static const int EVP_R_KEYGEN_FAILURE; -static const int EVP_R_MISSING_PARAMETERS; -static const int EVP_R_NO_CIPHER_SET; -static const int EVP_R_NO_DIGEST_SET; -static const int EVP_R_NO_DSA_PARAMETERS; -static const int EVP_R_NO_SIGN_FUNCTION_CONFIGURED; -static const int EVP_R_NO_VERIFY_FUNCTION_CONFIGURED; -static const int EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE; -static const int EVP_R_PUBLIC_KEY_NOT_RSA; -static const int EVP_R_UNKNOWN_PBE_ALGORITHM; -static const int EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS; -static const int EVP_R_UNSUPPORTED_CIPHER; -static const int EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION; -static const int EVP_R_UNSUPPORTED_KEYLENGTH; -static const int EVP_R_UNSUPPORTED_SALT_TYPE; -static const int EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM; -static const int EVP_R_WRONG_FINAL_BLOCK_LENGTH; -static const int EVP_R_WRONG_PUBLIC_KEY_TYPE; - -static const int EC_F_EC_GROUP_NEW_BY_CURVE_NAME; - -static const int EC_R_UNKNOWN_GROUP; - -static const int PEM_F_D2I_PKCS8PRIVATEKEY_BIO; -static const int PEM_F_D2I_PKCS8PRIVATEKEY_FP; -static const int PEM_F_DO_PK8PKEY; -static const int PEM_F_DO_PK8PKEY_FP; -static const int PEM_F_LOAD_IV; -static const int PEM_F_PEM_ASN1_READ; -static const int PEM_F_PEM_ASN1_READ_BIO; -static const int PEM_F_PEM_ASN1_WRITE; -static const int PEM_F_PEM_ASN1_WRITE_BIO; -static const int PEM_F_PEM_DEF_CALLBACK; -static const int PEM_F_PEM_DO_HEADER; -static const int PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY; -static const int PEM_F_PEM_GET_EVP_CIPHER_INFO; -static const int PEM_F_PEM_PK8PKEY; -static const int PEM_F_PEM_READ; -static const int PEM_F_PEM_READ_BIO; -static const int PEM_F_PEM_READ_BIO_PRIVATEKEY; -static const int PEM_F_PEM_READ_PRIVATEKEY; -static const int PEM_F_PEM_SEALFINAL; -static const int PEM_F_PEM_SEALINIT; -static const int PEM_F_PEM_SIGNFINAL; -static const int PEM_F_PEM_WRITE; -static const int PEM_F_PEM_WRITE_BIO; -static const int PEM_F_PEM_X509_INFO_READ; -static const int PEM_F_PEM_X509_INFO_READ_BIO; -static const int PEM_F_PEM_X509_INFO_WRITE_BIO; - -static const int PEM_R_BAD_BASE64_DECODE; -static const int PEM_R_BAD_DECRYPT; -static const int PEM_R_BAD_END_LINE; -static const int PEM_R_BAD_IV_CHARS; -static const int PEM_R_BAD_PASSWORD_READ; -static const int PEM_R_ERROR_CONVERTING_PRIVATE_KEY; -static const int PEM_R_NO_START_LINE; -static const int PEM_R_NOT_DEK_INFO; -static const int PEM_R_NOT_ENCRYPTED; -static const int PEM_R_NOT_PROC_TYPE; -static const int PEM_R_PROBLEMS_GETTING_PASSWORD; -static const int PEM_R_PUBLIC_KEY_NO_RSA; -static const int PEM_R_READ_KEY; -static const int PEM_R_SHORT_HEADER; -static const int PEM_R_UNSUPPORTED_CIPHER; -static const int PEM_R_UNSUPPORTED_ENCRYPTION; - -static const int RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE; -static const int RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY; -static const int RSA_R_BLOCK_TYPE_IS_NOT_01; -static const int RSA_R_BLOCK_TYPE_IS_NOT_02; -""" - -FUNCTIONS = """ -void ERR_load_crypto_strings(void); -void ERR_load_SSL_strings(void); -void ERR_free_strings(void); -char* ERR_error_string(unsigned long, char *); -void ERR_error_string_n(unsigned long, char *, size_t); -const char* ERR_lib_error_string(unsigned long); -const char* ERR_func_error_string(unsigned long); -const char* ERR_reason_error_string(unsigned long); -void ERR_print_errors(BIO *); -void ERR_print_errors_fp(FILE *); -unsigned long ERR_get_error(void); -unsigned long ERR_peek_error(void); -unsigned long ERR_peek_last_error(void); -unsigned long ERR_get_error_line(const char **, int *); -unsigned long ERR_peek_error_line(const char **, int *); -unsigned long ERR_peek_last_error_line(const char **, int *); -unsigned long ERR_get_error_line_data(const char **, int *, - const char **, int *); -unsigned long ERR_peek_error_line_data(const char **, - int *, const char **, int *); -unsigned long ERR_peek_last_error_line_data(const char **, - int *, const char **, int *); -void ERR_put_error(int, int, int, const char *, int); -void ERR_add_error_data(int, ...); -int ERR_get_next_error_library(void); -""" - -MACROS = """ -unsigned long ERR_PACK(int, int, int); -int ERR_GET_LIB(unsigned long); -int ERR_GET_FUNC(unsigned long); -int ERR_GET_REASON(unsigned long); -int ERR_FATAL_ERROR(unsigned long); -/* introduced in 1.0.0 so we have to handle this specially to continue - * supporting 0.9.8 - */ -void ERR_remove_thread_state(const CRYPTO_THREADID *); - -/* These were added in OpenSSL 0.9.8h. When we drop support for RHEL/CentOS 5 - we should be able to move these back to TYPES. */ -static const int ASN1_F_B64_READ_ASN1; -static const int ASN1_F_B64_WRITE_ASN1; -static const int ASN1_F_SMIME_READ_ASN1; -static const int ASN1_F_SMIME_TEXT; -static const int ASN1_R_NO_CONTENT_TYPE; -static const int ASN1_R_NO_MULTIPART_BODY_FAILURE; -static const int ASN1_R_NO_MULTIPART_BOUNDARY; -/* These were added in OpenSSL 0.9.8c. */ -static const int EVP_F_CAMELLIA_INIT_KEY; -static const int EVP_R_CAMELLIA_KEY_SETUP_FAILED; -""" - -CUSTOMIZATIONS = """ -#if OPENSSL_VERSION_NUMBER >= 0x10000000L -static const long Cryptography_HAS_REMOVE_THREAD_STATE = 1; -#else -static const long Cryptography_HAS_REMOVE_THREAD_STATE = 0; -typedef uint32_t CRYPTO_THREADID; -void (*ERR_remove_thread_state)(const CRYPTO_THREADID *) = NULL; -#endif - -/* OpenSSL 0.9.8h+ */ -#if OPENSSL_VERSION_NUMBER >= 0x0090808fL -static const long Cryptography_HAS_098H_ERROR_CODES = 1; -#else -static const long Cryptography_HAS_098H_ERROR_CODES = 0; -static const int ASN1_F_B64_READ_ASN1 = 0; -static const int ASN1_F_B64_WRITE_ASN1 = 0; -static const int ASN1_F_SMIME_READ_ASN1 = 0; -static const int ASN1_F_SMIME_TEXT = 0; -static const int ASN1_R_NO_CONTENT_TYPE = 0; -static const int ASN1_R_NO_MULTIPART_BODY_FAILURE = 0; -static const int ASN1_R_NO_MULTIPART_BOUNDARY = 0; -#endif - -/* OpenSSL 0.9.8c+ */ -#ifdef EVP_F_CAMELLIA_INIT_KEY -static const long Cryptography_HAS_098C_CAMELLIA_CODES = 1; -#else -static const long Cryptography_HAS_098C_CAMELLIA_CODES = 0; -static const int EVP_F_CAMELLIA_INIT_KEY = 0; -static const int EVP_R_CAMELLIA_KEY_SETUP_FAILED = 0; -#endif - -// OpenSSL without EC. e.g. RHEL -#ifndef OPENSSL_NO_EC -static const long Cryptography_HAS_EC_CODES = 1; -#else -static const long Cryptography_HAS_EC_CODES = 0; -static const int EC_R_UNKNOWN_GROUP = 0; -static const int EC_F_EC_GROUP_NEW_BY_CURVE_NAME = 0; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_REMOVE_THREAD_STATE": [ - "ERR_remove_thread_state" - ], - "Cryptography_HAS_098H_ERROR_CODES": [ - "ASN1_F_B64_READ_ASN1", - "ASN1_F_B64_WRITE_ASN1", - "ASN1_F_SMIME_READ_ASN1", - "ASN1_F_SMIME_TEXT", - "ASN1_R_NO_CONTENT_TYPE", - "ASN1_R_NO_MULTIPART_BODY_FAILURE", - "ASN1_R_NO_MULTIPART_BOUNDARY", - ], - "Cryptography_HAS_098C_CAMELLIA_CODES": [ - "EVP_F_CAMELLIA_INIT_KEY", - "EVP_R_CAMELLIA_KEY_SETUP_FAILED" - ], - "Cryptography_HAS_EC_CODES": [ - "EC_R_UNKNOWN_GROUP", - "EC_F_EC_GROUP_NEW_BY_CURVE_NAME" - ] -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/evp.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/evp.py deleted file mode 100644 index 1183450..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/evp.py +++ /dev/null @@ -1,261 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... EVP_CIPHER; -typedef struct { - const EVP_CIPHER *cipher; - ENGINE *engine; - int encrypt; - ...; -} EVP_CIPHER_CTX; -typedef ... EVP_MD; -typedef struct env_md_ctx_st { - ...; -} EVP_MD_CTX; - -typedef struct evp_pkey_st { - int type; - ...; -} EVP_PKEY; -typedef ... EVP_PKEY_CTX; -static const int EVP_PKEY_RSA; -static const int EVP_PKEY_DSA; -static const int EVP_PKEY_EC; -static const int EVP_MAX_MD_SIZE; -static const int EVP_CTRL_GCM_SET_IVLEN; -static const int EVP_CTRL_GCM_GET_TAG; -static const int EVP_CTRL_GCM_SET_TAG; - -static const int Cryptography_HAS_GCM; -static const int Cryptography_HAS_PBKDF2_HMAC; -static const int Cryptography_HAS_PKEY_CTX; -""" - -FUNCTIONS = """ -const EVP_CIPHER *EVP_get_cipherbyname(const char *); -int EVP_EncryptInit_ex(EVP_CIPHER_CTX *, const EVP_CIPHER *, ENGINE *, - const unsigned char *, const unsigned char *); -int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *, int); -int EVP_EncryptUpdate(EVP_CIPHER_CTX *, unsigned char *, int *, - const unsigned char *, int); -int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *, unsigned char *, int *); -int EVP_DecryptInit_ex(EVP_CIPHER_CTX *, const EVP_CIPHER *, ENGINE *, - const unsigned char *, const unsigned char *); -int EVP_DecryptUpdate(EVP_CIPHER_CTX *, unsigned char *, int *, - const unsigned char *, int); -int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *, unsigned char *, int *); -int EVP_CipherInit_ex(EVP_CIPHER_CTX *, const EVP_CIPHER *, ENGINE *, - const unsigned char *, const unsigned char *, int); -int EVP_CipherUpdate(EVP_CIPHER_CTX *, unsigned char *, int *, - const unsigned char *, int); -int EVP_CipherFinal_ex(EVP_CIPHER_CTX *, unsigned char *, int *); -int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *); -void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *); -EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); -void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *); -int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *, int); - -EVP_MD_CTX *EVP_MD_CTX_create(void); -int EVP_MD_CTX_copy_ex(EVP_MD_CTX *, const EVP_MD_CTX *); -int EVP_DigestInit_ex(EVP_MD_CTX *, const EVP_MD *, ENGINE *); -int EVP_DigestUpdate(EVP_MD_CTX *, const void *, size_t); -int EVP_DigestFinal_ex(EVP_MD_CTX *, unsigned char *, unsigned int *); -int EVP_MD_CTX_cleanup(EVP_MD_CTX *); -void EVP_MD_CTX_destroy(EVP_MD_CTX *); -const EVP_MD *EVP_get_digestbyname(const char *); - -EVP_PKEY *EVP_PKEY_new(void); -void EVP_PKEY_free(EVP_PKEY *); -int EVP_PKEY_type(int); -int EVP_PKEY_bits(EVP_PKEY *); -int EVP_PKEY_size(EVP_PKEY *); -RSA *EVP_PKEY_get1_RSA(EVP_PKEY *); -DSA *EVP_PKEY_get1_DSA(EVP_PKEY *); -DH *EVP_PKEY_get1_DH(EVP_PKEY *); - -int EVP_SignInit(EVP_MD_CTX *, const EVP_MD *); -int EVP_SignUpdate(EVP_MD_CTX *, const void *, size_t); -int EVP_SignFinal(EVP_MD_CTX *, unsigned char *, unsigned int *, EVP_PKEY *); - -int EVP_VerifyInit(EVP_MD_CTX *, const EVP_MD *); -int EVP_VerifyUpdate(EVP_MD_CTX *, const void *, size_t); -int EVP_VerifyFinal(EVP_MD_CTX *, const unsigned char *, unsigned int, - EVP_PKEY *); - -const EVP_MD *EVP_md5(void); - -int PKCS5_PBKDF2_HMAC_SHA1(const char *, int, const unsigned char *, int, int, - int, unsigned char *); - -int EVP_PKEY_set1_RSA(EVP_PKEY *, struct rsa_st *); -int EVP_PKEY_set1_DSA(EVP_PKEY *, struct dsa_st *); -int EVP_PKEY_set1_DH(EVP_PKEY *, DH *); - -int EVP_PKEY_get_attr_count(const EVP_PKEY *); -int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *, int, int); -int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *, ASN1_OBJECT *, int); -X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *, int); -X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *, int); -int EVP_PKEY_add1_attr(EVP_PKEY *, X509_ATTRIBUTE *); -int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *, const ASN1_OBJECT *, int, - const unsigned char *, int); -int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *, int, int, - const unsigned char *, int); -int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *, const char *, int, - const unsigned char *, int); -""" - -MACROS = """ -void OpenSSL_add_all_algorithms(void); -int EVP_PKEY_assign_RSA(EVP_PKEY *, RSA *); -int EVP_PKEY_assign_DSA(EVP_PKEY *, DSA *); - -int EVP_PKEY_assign_EC_KEY(EVP_PKEY *, EC_KEY *); -EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *); -int EVP_PKEY_set1_EC_KEY(EVP_PKEY *, EC_KEY *); - -int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *); -int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *, int, int, void *); - -int PKCS5_PBKDF2_HMAC(const char *, int, const unsigned char *, int, int, - const EVP_MD *, int, unsigned char *); - -int EVP_PKEY_CTX_set_signature_md(EVP_PKEY_CTX *, const EVP_MD *); - -/* These aren't macros, but must be in this section because they're not - available in 0.9.8. */ -EVP_PKEY_CTX *EVP_PKEY_CTX_new(EVP_PKEY *, ENGINE *); -EVP_PKEY_CTX *EVP_PKEY_CTX_new_id(int, ENGINE *); -EVP_PKEY_CTX *EVP_PKEY_CTX_dup(EVP_PKEY_CTX *); -void EVP_PKEY_CTX_free(EVP_PKEY_CTX *); -int EVP_PKEY_sign_init(EVP_PKEY_CTX *); -int EVP_PKEY_sign(EVP_PKEY_CTX *, unsigned char *, size_t *, - const unsigned char *, size_t); -int EVP_PKEY_verify_init(EVP_PKEY_CTX *); -int EVP_PKEY_verify(EVP_PKEY_CTX *, const unsigned char *, size_t, - const unsigned char *, size_t); -int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *); -int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *); - -/* The following were macros in 0.9.8e. Once we drop support for RHEL/CentOS 5 - we should move these back to FUNCTIONS. */ -const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *); -int EVP_CIPHER_block_size(const EVP_CIPHER *); -const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *); -int EVP_MD_size(const EVP_MD *); - -/* Must be in macros because EVP_PKEY_CTX is undefined in 0.9.8 */ -int Cryptography_EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out, - size_t *outlen, const unsigned char *in, - size_t inlen); -int Cryptography_EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, - size_t *outlen, const unsigned char *in, - size_t inlen); -""" - -CUSTOMIZATIONS = """ -#ifdef EVP_CTRL_GCM_SET_TAG -const long Cryptography_HAS_GCM = 1; -#else -const long Cryptography_HAS_GCM = 0; -const long EVP_CTRL_GCM_GET_TAG = -1; -const long EVP_CTRL_GCM_SET_TAG = -1; -const long EVP_CTRL_GCM_SET_IVLEN = -1; -#endif -#if OPENSSL_VERSION_NUMBER >= 0x10000000L -const long Cryptography_HAS_PBKDF2_HMAC = 1; -const long Cryptography_HAS_PKEY_CTX = 1; - -/* OpenSSL 0.9.8 defines EVP_PKEY_encrypt and EVP_PKEY_decrypt functions, - but they are a completely different signature from the ones in 1.0.0+. - These wrapper functions allows us to safely declare them on any version and - conditionally remove them on 0.9.8. */ -int Cryptography_EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx, unsigned char *out, - size_t *outlen, const unsigned char *in, - size_t inlen) { - return EVP_PKEY_encrypt(ctx, out, outlen, in, inlen); -} -int Cryptography_EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, - size_t *outlen, const unsigned char *in, - size_t inlen) { - return EVP_PKEY_decrypt(ctx, out, outlen, in, inlen); -} -#else -const long Cryptography_HAS_PBKDF2_HMAC = 0; -int (*PKCS5_PBKDF2_HMAC)(const char *, int, const unsigned char *, int, int, - const EVP_MD *, int, unsigned char *) = NULL; -const long Cryptography_HAS_PKEY_CTX = 0; -typedef void EVP_PKEY_CTX; -int (*EVP_PKEY_CTX_set_signature_md)(EVP_PKEY_CTX *, const EVP_MD *) = NULL; -int (*EVP_PKEY_sign_init)(EVP_PKEY_CTX *) = NULL; -int (*EVP_PKEY_sign)(EVP_PKEY_CTX *, unsigned char *, size_t *, - const unsigned char *, size_t) = NULL; -int (*EVP_PKEY_verify_init)(EVP_PKEY_CTX *) = NULL; -int (*EVP_PKEY_verify)(EVP_PKEY_CTX *, const unsigned char *, size_t, - const unsigned char *, size_t) = NULL; -EVP_PKEY_CTX *(*EVP_PKEY_CTX_new)(EVP_PKEY *, ENGINE *) = NULL; -EVP_PKEY_CTX *(*EVP_PKEY_CTX_new_id)(int, ENGINE *) = NULL; -EVP_PKEY_CTX *(*EVP_PKEY_CTX_dup)(EVP_PKEY_CTX *) = NULL; -void (*EVP_PKEY_CTX_free)(EVP_PKEY_CTX *) = NULL; -int (*EVP_PKEY_encrypt_init)(EVP_PKEY_CTX *) = NULL; -int (*EVP_PKEY_decrypt_init)(EVP_PKEY_CTX *) = NULL; -int (*Cryptography_EVP_PKEY_encrypt)(EVP_PKEY_CTX *, unsigned char *, size_t *, - const unsigned char *, size_t) = NULL; -int (*Cryptography_EVP_PKEY_decrypt)(EVP_PKEY_CTX *, unsigned char *, size_t *, - const unsigned char *, size_t) = NULL; -#endif -#ifdef OPENSSL_NO_EC -int (*EVP_PKEY_assign_EC_KEY)(EVP_PKEY *, EC_KEY *) = NULL; -EC_KEY *(*EVP_PKEY_get1_EC_KEY)(EVP_PKEY *) = NULL; -int (*EVP_PKEY_set1_EC_KEY)(EVP_PKEY *, EC_KEY *) = NULL; -#endif - -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_GCM": [ - "EVP_CTRL_GCM_GET_TAG", - "EVP_CTRL_GCM_SET_TAG", - "EVP_CTRL_GCM_SET_IVLEN", - ], - "Cryptography_HAS_PBKDF2_HMAC": [ - "PKCS5_PBKDF2_HMAC" - ], - "Cryptography_HAS_PKEY_CTX": [ - "EVP_PKEY_CTX_new", - "EVP_PKEY_CTX_new_id", - "EVP_PKEY_CTX_dup", - "EVP_PKEY_CTX_free", - "EVP_PKEY_sign", - "EVP_PKEY_sign_init", - "EVP_PKEY_verify", - "EVP_PKEY_verify_init", - "Cryptography_EVP_PKEY_encrypt", - "EVP_PKEY_encrypt_init", - "Cryptography_EVP_PKEY_decrypt", - "EVP_PKEY_decrypt_init", - "EVP_PKEY_CTX_set_signature_md", - ], - "Cryptography_HAS_EC": [ - "EVP_PKEY_assign_EC_KEY", - "EVP_PKEY_get1_EC_KEY", - "EVP_PKEY_set1_EC_KEY", - ] -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/hmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/hmac.py deleted file mode 100644 index 6a64b92..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/hmac.py +++ /dev/null @@ -1,94 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct { ...; } HMAC_CTX; -""" - -FUNCTIONS = """ -void HMAC_CTX_init(HMAC_CTX *); -void HMAC_CTX_cleanup(HMAC_CTX *); - -int Cryptography_HMAC_Init_ex(HMAC_CTX *, const void *, int, const EVP_MD *, - ENGINE *); -int Cryptography_HMAC_Update(HMAC_CTX *, const unsigned char *, size_t); -int Cryptography_HMAC_Final(HMAC_CTX *, unsigned char *, unsigned int *); -int Cryptography_HMAC_CTX_copy(HMAC_CTX *, HMAC_CTX *); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -int Cryptography_HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int key_len, - const EVP_MD *md, ENGINE *impl) { -#if OPENSSL_VERSION_NUMBER >= 0x010000000 - return HMAC_Init_ex(ctx, key, key_len, md, impl); -#else - HMAC_Init_ex(ctx, key, key_len, md, impl); - return 1; -#endif -} - -int Cryptography_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, - size_t data_len) { -#if OPENSSL_VERSION_NUMBER >= 0x010000000 - return HMAC_Update(ctx, data, data_len); -#else - HMAC_Update(ctx, data, data_len); - return 1; -#endif -} - -int Cryptography_HMAC_Final(HMAC_CTX *ctx, unsigned char *digest, - unsigned int *outlen) { -#if OPENSSL_VERSION_NUMBER >= 0x010000000 - return HMAC_Final(ctx, digest, outlen); -#else - HMAC_Final(ctx, digest, outlen); - return 1; -#endif -} - -int Cryptography_HMAC_CTX_copy(HMAC_CTX *dst_ctx, HMAC_CTX *src_ctx) { -#if OPENSSL_VERSION_NUMBER >= 0x010000000 - return HMAC_CTX_copy(dst_ctx, src_ctx); -#else - HMAC_CTX_init(dst_ctx); - if (!EVP_MD_CTX_copy_ex(&dst_ctx->i_ctx, &src_ctx->i_ctx)) { - goto err; - } - if (!EVP_MD_CTX_copy_ex(&dst_ctx->o_ctx, &src_ctx->o_ctx)) { - goto err; - } - if (!EVP_MD_CTX_copy_ex(&dst_ctx->md_ctx, &src_ctx->md_ctx)) { - goto err; - } - memcpy(dst_ctx->key, src_ctx->key, HMAC_MAX_MD_CBLOCK); - dst_ctx->key_length = src_ctx->key_length; - dst_ctx->md = src_ctx->md; - return 1; - - err: - return 0; -#endif -} -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/nid.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/nid.py deleted file mode 100644 index 133d2ca..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/nid.py +++ /dev/null @@ -1,216 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = "" - -TYPES = """ -static const int Cryptography_HAS_ECDSA_SHA2_NIDS; - -static const int NID_undef; -static const int NID_dsa; -static const int NID_dsaWithSHA; -static const int NID_dsaWithSHA1; -static const int NID_md2; -static const int NID_md4; -static const int NID_md5; -static const int NID_mdc2; -static const int NID_ripemd160; -static const int NID_sha; -static const int NID_sha1; -static const int NID_sha256; -static const int NID_sha384; -static const int NID_sha512; -static const int NID_sha224; -static const int NID_sha; -static const int NID_ecdsa_with_SHA1; -static const int NID_ecdsa_with_SHA224; -static const int NID_ecdsa_with_SHA256; -static const int NID_ecdsa_with_SHA384; -static const int NID_ecdsa_with_SHA512; -static const int NID_crl_reason; -static const int NID_pbe_WithSHA1And3_Key_TripleDES_CBC; -static const int NID_subject_alt_name; -static const int NID_issuer_alt_name; -static const int NID_X9_62_c2pnb163v1; -static const int NID_X9_62_c2pnb163v2; -static const int NID_X9_62_c2pnb163v3; -static const int NID_X9_62_c2pnb176v1; -static const int NID_X9_62_c2tnb191v1; -static const int NID_X9_62_c2tnb191v2; -static const int NID_X9_62_c2tnb191v3; -static const int NID_X9_62_c2onb191v4; -static const int NID_X9_62_c2onb191v5; -static const int NID_X9_62_c2pnb208w1; -static const int NID_X9_62_c2tnb239v1; -static const int NID_X9_62_c2tnb239v2; -static const int NID_X9_62_c2tnb239v3; -static const int NID_X9_62_c2onb239v4; -static const int NID_X9_62_c2onb239v5; -static const int NID_X9_62_c2pnb272w1; -static const int NID_X9_62_c2pnb304w1; -static const int NID_X9_62_c2tnb359v1; -static const int NID_X9_62_c2pnb368w1; -static const int NID_X9_62_c2tnb431r1; -static const int NID_X9_62_prime192v1; -static const int NID_X9_62_prime192v2; -static const int NID_X9_62_prime192v3; -static const int NID_X9_62_prime239v1; -static const int NID_X9_62_prime239v2; -static const int NID_X9_62_prime239v3; -static const int NID_X9_62_prime256v1; -static const int NID_secp112r1; -static const int NID_secp112r2; -static const int NID_secp128r1; -static const int NID_secp128r2; -static const int NID_secp160k1; -static const int NID_secp160r1; -static const int NID_secp160r2; -static const int NID_sect163k1; -static const int NID_sect163r1; -static const int NID_sect163r2; -static const int NID_secp192k1; -static const int NID_secp224k1; -static const int NID_secp224r1; -static const int NID_secp256k1; -static const int NID_secp384r1; -static const int NID_secp521r1; -static const int NID_sect113r1; -static const int NID_sect113r2; -static const int NID_sect131r1; -static const int NID_sect131r2; -static const int NID_sect193r1; -static const int NID_sect193r2; -static const int NID_sect233k1; -static const int NID_sect233r1; -static const int NID_sect239k1; -static const int NID_sect283k1; -static const int NID_sect283r1; -static const int NID_sect409k1; -static const int NID_sect409r1; -static const int NID_sect571k1; -static const int NID_sect571r1; -static const int NID_wap_wsg_idm_ecid_wtls1; -static const int NID_wap_wsg_idm_ecid_wtls3; -static const int NID_wap_wsg_idm_ecid_wtls4; -static const int NID_wap_wsg_idm_ecid_wtls5; -static const int NID_wap_wsg_idm_ecid_wtls6; -static const int NID_wap_wsg_idm_ecid_wtls7; -static const int NID_wap_wsg_idm_ecid_wtls8; -static const int NID_wap_wsg_idm_ecid_wtls9; -static const int NID_wap_wsg_idm_ecid_wtls10; -static const int NID_wap_wsg_idm_ecid_wtls11; -static const int NID_wap_wsg_idm_ecid_wtls12; -static const int NID_ipsec3; -static const int NID_ipsec4; -static const char *const SN_X9_62_c2pnb163v1; -static const char *const SN_X9_62_c2pnb163v2; -static const char *const SN_X9_62_c2pnb163v3; -static const char *const SN_X9_62_c2pnb176v1; -static const char *const SN_X9_62_c2tnb191v1; -static const char *const SN_X9_62_c2tnb191v2; -static const char *const SN_X9_62_c2tnb191v3; -static const char *const SN_X9_62_c2onb191v4; -static const char *const SN_X9_62_c2onb191v5; -static const char *const SN_X9_62_c2pnb208w1; -static const char *const SN_X9_62_c2tnb239v1; -static const char *const SN_X9_62_c2tnb239v2; -static const char *const SN_X9_62_c2tnb239v3; -static const char *const SN_X9_62_c2onb239v4; -static const char *const SN_X9_62_c2onb239v5; -static const char *const SN_X9_62_c2pnb272w1; -static const char *const SN_X9_62_c2pnb304w1; -static const char *const SN_X9_62_c2tnb359v1; -static const char *const SN_X9_62_c2pnb368w1; -static const char *const SN_X9_62_c2tnb431r1; -static const char *const SN_X9_62_prime192v1; -static const char *const SN_X9_62_prime192v2; -static const char *const SN_X9_62_prime192v3; -static const char *const SN_X9_62_prime239v1; -static const char *const SN_X9_62_prime239v2; -static const char *const SN_X9_62_prime239v3; -static const char *const SN_X9_62_prime256v1; -static const char *const SN_secp112r1; -static const char *const SN_secp112r2; -static const char *const SN_secp128r1; -static const char *const SN_secp128r2; -static const char *const SN_secp160k1; -static const char *const SN_secp160r1; -static const char *const SN_secp160r2; -static const char *const SN_sect163k1; -static const char *const SN_sect163r1; -static const char *const SN_sect163r2; -static const char *const SN_secp192k1; -static const char *const SN_secp224k1; -static const char *const SN_secp224r1; -static const char *const SN_secp256k1; -static const char *const SN_secp384r1; -static const char *const SN_secp521r1; -static const char *const SN_sect113r1; -static const char *const SN_sect113r2; -static const char *const SN_sect131r1; -static const char *const SN_sect131r2; -static const char *const SN_sect193r1; -static const char *const SN_sect193r2; -static const char *const SN_sect233k1; -static const char *const SN_sect233r1; -static const char *const SN_sect239k1; -static const char *const SN_sect283k1; -static const char *const SN_sect283r1; -static const char *const SN_sect409k1; -static const char *const SN_sect409r1; -static const char *const SN_sect571k1; -static const char *const SN_sect571r1; -static const char *const SN_wap_wsg_idm_ecid_wtls1; -static const char *const SN_wap_wsg_idm_ecid_wtls3; -static const char *const SN_wap_wsg_idm_ecid_wtls4; -static const char *const SN_wap_wsg_idm_ecid_wtls5; -static const char *const SN_wap_wsg_idm_ecid_wtls6; -static const char *const SN_wap_wsg_idm_ecid_wtls7; -static const char *const SN_wap_wsg_idm_ecid_wtls8; -static const char *const SN_wap_wsg_idm_ecid_wtls9; -static const char *const SN_wap_wsg_idm_ecid_wtls10; -static const char *const SN_wap_wsg_idm_ecid_wtls11; -static const char *const SN_wap_wsg_idm_ecid_wtls12; -static const char *const SN_ipsec3; -static const char *const SN_ipsec4; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -/* OpenSSL 0.9.8g+ */ -#if OPENSSL_VERSION_NUMBER >= 0x0090807fL -static const long Cryptography_HAS_ECDSA_SHA2_NIDS = 1; -#else -static const long Cryptography_HAS_ECDSA_SHA2_NIDS = 0; -static const int NID_ecdsa_with_SHA224 = 0; -static const int NID_ecdsa_with_SHA256 = 0; -static const int NID_ecdsa_with_SHA384 = 0; -static const int NID_ecdsa_with_SHA512 = 0; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_ECDSA_SHA2_NIDS": [ - "NID_ecdsa_with_SHA224", - "NID_ecdsa_with_SHA256", - "NID_ecdsa_with_SHA384", - "NID_ecdsa_with_SHA512", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/objects.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/objects.py deleted file mode 100644 index 557c015..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/objects.py +++ /dev/null @@ -1,45 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -""" - -FUNCTIONS = """ -ASN1_OBJECT *OBJ_nid2obj(int); -const char *OBJ_nid2ln(int); -const char *OBJ_nid2sn(int); -int OBJ_obj2nid(const ASN1_OBJECT *); -int OBJ_ln2nid(const char *); -int OBJ_sn2nid(const char *); -int OBJ_txt2nid(const char *); -ASN1_OBJECT *OBJ_txt2obj(const char *, int); -int OBJ_obj2txt(char *, int, const ASN1_OBJECT *, int); -int OBJ_cmp(const ASN1_OBJECT *, const ASN1_OBJECT *); -ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *); -int OBJ_create(const char *, const char *, const char *); -void OBJ_cleanup(void); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/opensslv.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/opensslv.py deleted file mode 100644 index ef6e057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/opensslv.py +++ /dev/null @@ -1,36 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -/* Note that these will be resolved when cryptography is compiled and are NOT - guaranteed to be the version that it actually loads. */ -static const int OPENSSL_VERSION_NUMBER; -static const char *const OPENSSL_VERSION_TEXT; -""" - -FUNCTIONS = """ -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/osrandom_engine.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/osrandom_engine.py deleted file mode 100644 index 462997c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/osrandom_engine.py +++ /dev/null @@ -1,218 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#ifdef _WIN32 -#include -#else -#include -#include -#endif -""" - -TYPES = """ -static const char *const Cryptography_osrandom_engine_name; -static const char *const Cryptography_osrandom_engine_id; -""" - -FUNCTIONS = """ -int Cryptography_add_osrandom_engine(void); -""" - -MACROS = """ -""" - -WIN32_CUSTOMIZATIONS = """ -static HCRYPTPROV hCryptProv = 0; - -static int osrandom_init(ENGINE *e) { - if (hCryptProv > 0) { - return 1; - } - if (CryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { - return 1; - } else { - return 0; - } -} - -static int osrandom_rand_bytes(unsigned char *buffer, int size) { - if (hCryptProv == 0) { - return 0; - } - - if (!CryptGenRandom(hCryptProv, (DWORD)size, buffer)) { - ERR_put_error( - ERR_LIB_RAND, 0, ERR_R_RAND_LIB, "osrandom_engine.py", 0 - ); - return 0; - } - return 1; -} - -static int osrandom_finish(ENGINE *e) { - if (CryptReleaseContext(hCryptProv, 0)) { - hCryptProv = 0; - return 1; - } else { - return 0; - } -} - -static int osrandom_rand_status(void) { - if (hCryptProv == 0) { - return 0; - } else { - return 1; - } -} -""" - -POSIX_CUSTOMIZATIONS = """ -static int urandom_fd = -1; - -static int osrandom_finish(ENGINE *e); - -static int osrandom_init(ENGINE *e) { - if (urandom_fd > -1) { - return 1; - } - urandom_fd = open("/dev/urandom", O_RDONLY); - if (urandom_fd > -1) { - int flags = fcntl(urandom_fd, F_GETFD); - if (flags == -1) { - osrandom_finish(e); - return 0; - } else if (fcntl(urandom_fd, F_SETFD, flags | FD_CLOEXEC) == -1) { - osrandom_finish(e); - return 0; - } - return 1; - } else { - return 0; - } -} - -static int osrandom_rand_bytes(unsigned char *buffer, int size) { - ssize_t n; - while (size > 0) { - do { - n = read(urandom_fd, buffer, (size_t)size); - } while (n < 0 && errno == EINTR); - if (n <= 0) { - ERR_put_error( - ERR_LIB_RAND, 0, ERR_R_RAND_LIB, "osrandom_engine.py", 0 - ); - return 0; - } - buffer += n; - size -= n; - } - return 1; -} - -static int osrandom_finish(ENGINE *e) { - int n; - do { - n = close(urandom_fd); - } while (n < 0 && errno == EINTR); - urandom_fd = -1; - if (n < 0) { - return 0; - } else { - return 1; - } -} - -static int osrandom_rand_status(void) { - if (urandom_fd == -1) { - return 0; - } else { - return 1; - } -} -""" - -CUSTOMIZATIONS = """ -static const char *Cryptography_osrandom_engine_id = "osrandom"; -static const char *Cryptography_osrandom_engine_name = "osrandom_engine"; - -#if defined(_WIN32) -%(WIN32_CUSTOMIZATIONS)s -#else -%(POSIX_CUSTOMIZATIONS)s -#endif - -/* This replicates the behavior of the OpenSSL FIPS RNG, which returns a - -1 in the event that there is an error when calling RAND_pseudo_bytes. */ -static int osrandom_pseudo_rand_bytes(unsigned char *buffer, int size) { - int res = osrandom_rand_bytes(buffer, size); - if (res == 0) { - return -1; - } else { - return res; - } -} - -static RAND_METHOD osrandom_rand = { - NULL, - osrandom_rand_bytes, - NULL, - NULL, - osrandom_pseudo_rand_bytes, - osrandom_rand_status, -}; - -/* Returns 1 if successfully added, 2 if engine has previously been added, - and 0 for error. */ -int Cryptography_add_osrandom_engine(void) { - ENGINE *e; - e = ENGINE_by_id(Cryptography_osrandom_engine_id); - if (e != NULL) { - ENGINE_free(e); - return 2; - } else { - ERR_clear_error(); - } - - e = ENGINE_new(); - if (e == NULL) { - return 0; - } - if(!ENGINE_set_id(e, Cryptography_osrandom_engine_id) || - !ENGINE_set_name(e, Cryptography_osrandom_engine_name) || - !ENGINE_set_RAND(e, &osrandom_rand) || - !ENGINE_set_init_function(e, osrandom_init) || - !ENGINE_set_finish_function(e, osrandom_finish)) { - ENGINE_free(e); - return 0; - } - if (!ENGINE_add(e)) { - ENGINE_free(e); - return 0; - } - if (!ENGINE_free(e)) { - return 0; - } - - return 1; -} -""" % { - "WIN32_CUSTOMIZATIONS": WIN32_CUSTOMIZATIONS, - "POSIX_CUSTOMIZATIONS": POSIX_CUSTOMIZATIONS, -} - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pem.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pem.py deleted file mode 100644 index 752f198..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pem.py +++ /dev/null @@ -1,89 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata); -""" - -FUNCTIONS = """ -X509 *PEM_read_bio_X509(BIO *, X509 **, pem_password_cb *, void *); -int PEM_write_bio_X509(BIO *, X509 *); - -int PEM_write_bio_PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, - unsigned char *, int, pem_password_cb *, void *); - -EVP_PKEY *PEM_read_bio_PrivateKey(BIO *, EVP_PKEY **, pem_password_cb *, - void *); - -int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *, - char *, int, pem_password_cb *, void *); -int PEM_write_bio_PKCS8PrivateKey_nid(BIO *, EVP_PKEY *, int, char *, int, - pem_password_cb *, void *); - -int i2d_PKCS8PrivateKey_bio(BIO *, EVP_PKEY *, const EVP_CIPHER *, - char *, int, pem_password_cb *, void *); -int i2d_PKCS8PrivateKey_nid_bio(BIO *, EVP_PKEY *, int, - char *, int, pem_password_cb *, void *); - -PKCS7 *d2i_PKCS7_bio(BIO *, PKCS7 **); -EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *, EVP_PKEY **, pem_password_cb *, - void *); - -int PEM_write_bio_X509_REQ(BIO *, X509_REQ *); - -X509_REQ *PEM_read_bio_X509_REQ(BIO *, X509_REQ **, pem_password_cb *, void *); - -X509_CRL *PEM_read_bio_X509_CRL(BIO *, X509_CRL **, pem_password_cb *, void *); - -int PEM_write_bio_X509_CRL(BIO *, X509_CRL *); - -PKCS7 *PEM_read_bio_PKCS7(BIO *, PKCS7 **, pem_password_cb *, void *); -DH *PEM_read_bio_DHparams(BIO *, DH **, pem_password_cb *, void *); - -DSA *PEM_read_bio_DSAPrivateKey(BIO *, DSA **, pem_password_cb *, void *); - -RSA *PEM_read_bio_RSAPrivateKey(BIO *, RSA **, pem_password_cb *, void *); - -int PEM_write_bio_DSAPrivateKey(BIO *, DSA *, const EVP_CIPHER *, - unsigned char *, int, - pem_password_cb *, void *); - -int PEM_write_bio_RSAPrivateKey(BIO *, RSA *, const EVP_CIPHER *, - unsigned char *, int, - pem_password_cb *, void *); - -DSA *PEM_read_bio_DSA_PUBKEY(BIO *, DSA **, pem_password_cb *, void *); - -RSA *PEM_read_bio_RSAPublicKey(BIO *, RSA **, pem_password_cb *, void *); - -int PEM_write_bio_DSA_PUBKEY(BIO *, DSA *); - -int PEM_write_bio_RSAPublicKey(BIO *, const RSA *); - -EVP_PKEY *PEM_read_bio_PUBKEY(BIO *, EVP_PKEY **, pem_password_cb *, void *); -int PEM_write_bio_PUBKEY(BIO *, EVP_PKEY *); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs12.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs12.py deleted file mode 100644 index a8f106f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs12.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef ... PKCS12; -""" - -FUNCTIONS = """ -void PKCS12_free(PKCS12 *); - -PKCS12 *d2i_PKCS12_bio(BIO *, PKCS12 **); -int i2d_PKCS12_bio(BIO *, PKCS12 *); -""" - -MACROS = """ -int PKCS12_parse(PKCS12 *, const char *, EVP_PKEY **, X509 **, - Cryptography_STACK_OF_X509 **); -PKCS12 *PKCS12_create(char *, char *, EVP_PKEY *, X509 *, - Cryptography_STACK_OF_X509 *, int, int, int, int, int); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs7.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs7.py deleted file mode 100644 index 1343e56..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/pkcs7.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct { - ASN1_OBJECT *type; - ...; -} PKCS7; -""" - -FUNCTIONS = """ -void PKCS7_free(PKCS7 *); -""" - -MACROS = """ -int PKCS7_type_is_signed(PKCS7 *); -int PKCS7_type_is_enveloped(PKCS7 *); -int PKCS7_type_is_signedAndEnveloped(PKCS7 *); -int PKCS7_type_is_data(PKCS7 *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rand.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rand.py deleted file mode 100644 index 7b1be9d..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rand.py +++ /dev/null @@ -1,45 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -""" - -FUNCTIONS = """ -void ERR_load_RAND_strings(void); -void RAND_seed(const void *, int); -void RAND_add(const void *, int, double); -int RAND_status(void); -int RAND_egd(const char *); -int RAND_egd_bytes(const char *, int); -int RAND_query_egd_bytes(const char *, unsigned char *, int); -const char *RAND_file_name(char *, size_t); -int RAND_load_file(const char *, long); -int RAND_write_file(const char *); -void RAND_cleanup(void); -int RAND_bytes(unsigned char *, int); -int RAND_pseudo_bytes(unsigned char *, int); -""" - -MACROS = """ -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rsa.py deleted file mode 100644 index cb8e701..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/rsa.py +++ /dev/null @@ -1,108 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct rsa_st { - BIGNUM *n; - BIGNUM *e; - BIGNUM *d; - BIGNUM *p; - BIGNUM *q; - BIGNUM *dmp1; - BIGNUM *dmq1; - BIGNUM *iqmp; - ...; -} RSA; -typedef ... BN_GENCB; -static const int RSA_PKCS1_PADDING; -static const int RSA_SSLV23_PADDING; -static const int RSA_NO_PADDING; -static const int RSA_PKCS1_OAEP_PADDING; -static const int RSA_X931_PADDING; -static const int RSA_PKCS1_PSS_PADDING; -static const int RSA_F4; - -static const int Cryptography_HAS_PSS_PADDING; -static const int Cryptography_HAS_MGF1_MD; -""" - -FUNCTIONS = """ -RSA *RSA_new(void); -void RSA_free(RSA *); -int RSA_size(const RSA *); -int RSA_generate_key_ex(RSA *, int, BIGNUM *, BN_GENCB *); -int RSA_check_key(const RSA *); -RSA *RSAPublicKey_dup(RSA *); -int RSA_blinding_on(RSA *, BN_CTX *); -void RSA_blinding_off(RSA *); -int RSA_public_encrypt(int, const unsigned char *, unsigned char *, - RSA *, int); -int RSA_private_encrypt(int, const unsigned char *, unsigned char *, - RSA *, int); -int RSA_public_decrypt(int, const unsigned char *, unsigned char *, - RSA *, int); -int RSA_private_decrypt(int, const unsigned char *, unsigned char *, - RSA *, int); -int RSA_print(BIO *, const RSA *, int); -int RSA_verify_PKCS1_PSS(RSA *, const unsigned char *, const EVP_MD *, - const unsigned char *, int); -int RSA_padding_add_PKCS1_PSS(RSA *, unsigned char *, const unsigned char *, - const EVP_MD *, int); -int RSA_padding_add_PKCS1_OAEP(unsigned char *, int, const unsigned char *, - int, const unsigned char *, int); -int RSA_padding_check_PKCS1_OAEP(unsigned char *, int, const unsigned char *, - int, int, const unsigned char *, int); -""" - -MACROS = """ -int EVP_PKEY_CTX_set_rsa_padding(EVP_PKEY_CTX *, int); -int EVP_PKEY_CTX_set_rsa_pss_saltlen(EVP_PKEY_CTX *, int); -int EVP_PKEY_CTX_set_rsa_mgf1_md(EVP_PKEY_CTX *, EVP_MD *); -""" - -CUSTOMIZATIONS = """ -#if OPENSSL_VERSION_NUMBER >= 0x10000000 -static const long Cryptography_HAS_PSS_PADDING = 1; -#else -/* see evp.py for the definition of Cryptography_HAS_PKEY_CTX */ -static const long Cryptography_HAS_PSS_PADDING = 0; -int (*EVP_PKEY_CTX_set_rsa_padding)(EVP_PKEY_CTX *, int) = NULL; -int (*EVP_PKEY_CTX_set_rsa_pss_saltlen)(EVP_PKEY_CTX *, int) = NULL; -static const long RSA_PKCS1_PSS_PADDING = 0; -#endif -#if OPENSSL_VERSION_NUMBER >= 0x1000100f -static const long Cryptography_HAS_MGF1_MD = 1; -#else -static const long Cryptography_HAS_MGF1_MD = 0; -int (*EVP_PKEY_CTX_set_rsa_mgf1_md)(EVP_PKEY_CTX *, EVP_MD *) = NULL; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_PKEY_CTX": [ - "EVP_PKEY_CTX_set_rsa_padding", - "EVP_PKEY_CTX_set_rsa_pss_saltlen", - ], - "Cryptography_HAS_PSS_PADDING": [ - "RSA_PKCS1_PSS_PADDING", - ], - "Cryptography_HAS_MGF1_MD": [ - "EVP_PKEY_CTX_set_rsa_mgf1_md", - ], -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ssl.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ssl.py deleted file mode 100644 index 7d805e7..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/ssl.py +++ /dev/null @@ -1,620 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include - -typedef STACK_OF(SSL_CIPHER) Cryptography_STACK_OF_SSL_CIPHER; -""" - -TYPES = """ -/* - * Internally invented symbols to tell which versions of SSL/TLS are supported. -*/ -static const long Cryptography_HAS_SSL2; -static const long Cryptography_HAS_TLSv1_1; -static const long Cryptography_HAS_TLSv1_2; -static const long Cryptography_HAS_SECURE_RENEGOTIATION; - -/* Internally invented symbol to tell us if SNI is supported */ -static const long Cryptography_HAS_TLSEXT_HOSTNAME; - -/* Internally invented symbol to tell us if SSL_MODE_RELEASE_BUFFERS is - * supported - */ -static const long Cryptography_HAS_RELEASE_BUFFERS; - -/* Internally invented symbol to tell us if SSL_OP_NO_COMPRESSION is - * supported - */ -static const long Cryptography_HAS_OP_NO_COMPRESSION; - -static const long Cryptography_HAS_SSL_OP_MSIE_SSLV2_RSA_PADDING; -static const long Cryptography_HAS_SSL_SET_SSL_CTX; -static const long Cryptography_HAS_SSL_OP_NO_TICKET; -static const long Cryptography_HAS_NETBSD_D1_METH; -static const long Cryptography_HAS_NEXTPROTONEG; -static const long Cryptography_HAS_ALPN; - -static const long SSL_FILETYPE_PEM; -static const long SSL_FILETYPE_ASN1; -static const long SSL_ERROR_NONE; -static const long SSL_ERROR_ZERO_RETURN; -static const long SSL_ERROR_WANT_READ; -static const long SSL_ERROR_WANT_WRITE; -static const long SSL_ERROR_WANT_X509_LOOKUP; -static const long SSL_ERROR_SYSCALL; -static const long SSL_ERROR_SSL; -static const long SSL_SENT_SHUTDOWN; -static const long SSL_RECEIVED_SHUTDOWN; -static const long SSL_OP_NO_SSLv2; -static const long SSL_OP_NO_SSLv3; -static const long SSL_OP_NO_TLSv1; -static const long SSL_OP_NO_TLSv1_1; -static const long SSL_OP_NO_TLSv1_2; -static const long SSL_OP_NO_COMPRESSION; -static const long SSL_OP_SINGLE_DH_USE; -static const long SSL_OP_EPHEMERAL_RSA; -static const long SSL_OP_MICROSOFT_SESS_ID_BUG; -static const long SSL_OP_NETSCAPE_CHALLENGE_BUG; -static const long SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG; -static const long SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG; -static const long SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER; -static const long SSL_OP_MSIE_SSLV2_RSA_PADDING; -static const long SSL_OP_SSLEAY_080_CLIENT_DH_BUG; -static const long SSL_OP_TLS_D5_BUG; -static const long SSL_OP_TLS_BLOCK_PADDING_BUG; -static const long SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; -static const long SSL_OP_CIPHER_SERVER_PREFERENCE; -static const long SSL_OP_TLS_ROLLBACK_BUG; -static const long SSL_OP_PKCS1_CHECK_1; -static const long SSL_OP_PKCS1_CHECK_2; -static const long SSL_OP_NETSCAPE_CA_DN_BUG; -static const long SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG; -static const long SSL_OP_NO_QUERY_MTU; -static const long SSL_OP_COOKIE_EXCHANGE; -static const long SSL_OP_NO_TICKET; -static const long SSL_OP_ALL; -static const long SSL_OP_SINGLE_ECDH_USE; -static const long SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION; -static const long SSL_OP_LEGACY_SERVER_CONNECT; -static const long SSL_VERIFY_PEER; -static const long SSL_VERIFY_FAIL_IF_NO_PEER_CERT; -static const long SSL_VERIFY_CLIENT_ONCE; -static const long SSL_VERIFY_NONE; -static const long SSL_SESS_CACHE_OFF; -static const long SSL_SESS_CACHE_CLIENT; -static const long SSL_SESS_CACHE_SERVER; -static const long SSL_SESS_CACHE_BOTH; -static const long SSL_SESS_CACHE_NO_AUTO_CLEAR; -static const long SSL_SESS_CACHE_NO_INTERNAL_LOOKUP; -static const long SSL_SESS_CACHE_NO_INTERNAL_STORE; -static const long SSL_SESS_CACHE_NO_INTERNAL; -static const long SSL_ST_CONNECT; -static const long SSL_ST_ACCEPT; -static const long SSL_ST_MASK; -static const long SSL_ST_INIT; -static const long SSL_ST_BEFORE; -static const long SSL_ST_OK; -static const long SSL_ST_RENEGOTIATE; -static const long SSL_CB_LOOP; -static const long SSL_CB_EXIT; -static const long SSL_CB_READ; -static const long SSL_CB_WRITE; -static const long SSL_CB_ALERT; -static const long SSL_CB_READ_ALERT; -static const long SSL_CB_WRITE_ALERT; -static const long SSL_CB_ACCEPT_LOOP; -static const long SSL_CB_ACCEPT_EXIT; -static const long SSL_CB_CONNECT_LOOP; -static const long SSL_CB_CONNECT_EXIT; -static const long SSL_CB_HANDSHAKE_START; -static const long SSL_CB_HANDSHAKE_DONE; -static const long SSL_MODE_RELEASE_BUFFERS; -static const long SSL_MODE_ENABLE_PARTIAL_WRITE; -static const long SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER; -static const long SSL_MODE_AUTO_RETRY; -static const long SSL3_RANDOM_SIZE; -typedef ... SSL_METHOD; -typedef struct ssl_st { - int version; - int type; - ...; -} SSL_CTX; - -typedef struct { - int master_key_length; - unsigned char master_key[...]; - ...; -} SSL_SESSION; - -typedef struct { - unsigned char server_random[...]; - unsigned char client_random[...]; - ...; -} SSL3_STATE; - -typedef struct { - SSL3_STATE *s3; - SSL_SESSION *session; - int type; - ...; -} SSL; - -static const long TLSEXT_NAMETYPE_host_name; - -typedef ... SSL_CIPHER; -typedef ... Cryptography_STACK_OF_SSL_CIPHER; -typedef ... COMP_METHOD; -""" - -FUNCTIONS = """ -void SSL_load_error_strings(void); -int SSL_library_init(void); - -/* SSL */ -const char *SSL_state_string_long(const SSL *); -SSL_SESSION *SSL_get1_session(SSL *); -int SSL_set_session(SSL *, SSL_SESSION *); -int SSL_get_verify_mode(const SSL *); -void SSL_set_verify_depth(SSL *, int); -int SSL_get_verify_depth(const SSL *); -int (*SSL_get_verify_callback(const SSL *))(int, X509_STORE_CTX *); -void SSL_set_info_callback(SSL *ssl, void (*)(const SSL *, int, int)); -void (*SSL_get_info_callback(const SSL *))(const SSL *, int, int); -SSL *SSL_new(SSL_CTX *); -void SSL_free(SSL *); -int SSL_set_fd(SSL *, int); -void SSL_set_bio(SSL *, BIO *, BIO *); -void SSL_set_connect_state(SSL *); -void SSL_set_accept_state(SSL *); -void SSL_set_shutdown(SSL *, int); -int SSL_get_shutdown(const SSL *); -int SSL_pending(const SSL *); -int SSL_write(SSL *, const void *, int); -int SSL_read(SSL *, void *, int); -X509 *SSL_get_peer_certificate(const SSL *); -int SSL_get_ex_data_X509_STORE_CTX_idx(void); - -Cryptography_STACK_OF_X509 *SSL_get_peer_cert_chain(const SSL *); -Cryptography_STACK_OF_X509_NAME *SSL_get_client_CA_list(const SSL *); - -int SSL_get_error(const SSL *, int); -int SSL_do_handshake(SSL *); -int SSL_shutdown(SSL *); -const char *SSL_get_cipher_list(const SSL *, int); -Cryptography_STACK_OF_SSL_CIPHER *SSL_get_ciphers(const SSL *); - -const COMP_METHOD *SSL_get_current_compression(SSL *); -const COMP_METHOD *SSL_get_current_expansion(SSL *); -const char *SSL_COMP_get_name(const COMP_METHOD *); - -/* context */ -void SSL_CTX_free(SSL_CTX *); -long SSL_CTX_set_timeout(SSL_CTX *, long); -int SSL_CTX_set_default_verify_paths(SSL_CTX *); -void SSL_CTX_set_verify(SSL_CTX *, int, int (*)(int, X509_STORE_CTX *)); -void SSL_CTX_set_verify_depth(SSL_CTX *, int); -int (*SSL_CTX_get_verify_callback(const SSL_CTX *))(int, X509_STORE_CTX *); -int SSL_CTX_get_verify_mode(const SSL_CTX *); -int SSL_CTX_get_verify_depth(const SSL_CTX *); -int SSL_CTX_set_cipher_list(SSL_CTX *, const char *); -int SSL_CTX_load_verify_locations(SSL_CTX *, const char *, const char *); -void SSL_CTX_set_default_passwd_cb(SSL_CTX *, pem_password_cb *); -void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *, void *); -int SSL_CTX_use_certificate(SSL_CTX *, X509 *); -int SSL_CTX_use_certificate_file(SSL_CTX *, const char *, int); -int SSL_CTX_use_certificate_chain_file(SSL_CTX *, const char *); -int SSL_CTX_use_PrivateKey(SSL_CTX *, EVP_PKEY *); -int SSL_CTX_use_PrivateKey_file(SSL_CTX *, const char *, int); -void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *); -X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *); -int SSL_CTX_add_client_CA(SSL_CTX *, X509 *); - -void SSL_CTX_set_client_CA_list(SSL_CTX *, Cryptography_STACK_OF_X509_NAME *); - -/* SSL_SESSION */ -void SSL_SESSION_free(SSL_SESSION *); - -/* Information about actually used cipher */ -const char *SSL_CIPHER_get_name(const SSL_CIPHER *); -int SSL_CIPHER_get_bits(const SSL_CIPHER *, int *); -char *SSL_CIPHER_get_version(const SSL_CIPHER *); - -size_t SSL_get_finished(const SSL *, void *, size_t); -size_t SSL_get_peer_finished(const SSL *, void *, size_t); -""" - -MACROS = """ -unsigned long SSL_set_mode(SSL *, unsigned long); -unsigned long SSL_get_mode(SSL *); - -unsigned long SSL_set_options(SSL *, unsigned long); -unsigned long SSL_get_options(SSL *); - -int SSL_want_read(const SSL *); -int SSL_want_write(const SSL *); - -long SSL_total_renegotiations(SSL *); -long SSL_get_secure_renegotiation_support(SSL *); - -/* Defined as unsigned long because SSL_OP_ALL is greater than signed 32-bit - and Windows defines long as 32-bit. */ -unsigned long SSL_CTX_set_options(SSL_CTX *, unsigned long); -unsigned long SSL_CTX_get_options(SSL_CTX *); -unsigned long SSL_CTX_set_mode(SSL_CTX *, unsigned long); -unsigned long SSL_CTX_get_mode(SSL_CTX *); -unsigned long SSL_CTX_set_session_cache_mode(SSL_CTX *, unsigned long); -unsigned long SSL_CTX_get_session_cache_mode(SSL_CTX *); -unsigned long SSL_CTX_set_tmp_dh(SSL_CTX *, DH *); -unsigned long SSL_CTX_set_tmp_ecdh(SSL_CTX *, EC_KEY *); -unsigned long SSL_CTX_add_extra_chain_cert(SSL_CTX *, X509 *); - -/*- These aren't macros these functions are all const X on openssl > 1.0.x -*/ - -/* methods */ - -/* SSLv2 support is compiled out of some versions of OpenSSL. These will - * get special support when we generate the bindings so that if they are - * available they will be wrapped, but if they are not they won't cause - * problems (like link errors). - */ -const SSL_METHOD *SSLv2_method(void); -const SSL_METHOD *SSLv2_server_method(void); -const SSL_METHOD *SSLv2_client_method(void); - -/* - * TLSv1_1 and TLSv1_2 are recent additions. Only sufficiently new versions of - * OpenSSL support them. - */ -const SSL_METHOD *TLSv1_1_method(void); -const SSL_METHOD *TLSv1_1_server_method(void); -const SSL_METHOD *TLSv1_1_client_method(void); - -const SSL_METHOD *TLSv1_2_method(void); -const SSL_METHOD *TLSv1_2_server_method(void); -const SSL_METHOD *TLSv1_2_client_method(void); - -const SSL_METHOD *SSLv3_method(void); -const SSL_METHOD *SSLv3_server_method(void); -const SSL_METHOD *SSLv3_client_method(void); - -const SSL_METHOD *TLSv1_method(void); -const SSL_METHOD *TLSv1_server_method(void); -const SSL_METHOD *TLSv1_client_method(void); - -const SSL_METHOD *DTLSv1_method(void); -const SSL_METHOD *DTLSv1_server_method(void); -const SSL_METHOD *DTLSv1_client_method(void); - -const SSL_METHOD *SSLv23_method(void); -const SSL_METHOD *SSLv23_server_method(void); -const SSL_METHOD *SSLv23_client_method(void); - -/*- These aren't macros these arguments are all const X on openssl > 1.0.x -*/ -SSL_CTX *SSL_CTX_new(SSL_METHOD *); -long SSL_CTX_get_timeout(const SSL_CTX *); - -const SSL_CIPHER *SSL_get_current_cipher(const SSL *); - -/* SNI APIs were introduced in OpenSSL 1.0.0. To continue to support - * earlier versions some special handling of these is necessary. - */ -const char *SSL_get_servername(const SSL *, const int); -void SSL_set_tlsext_host_name(SSL *, char *); -void SSL_CTX_set_tlsext_servername_callback( - SSL_CTX *, - int (*)(const SSL *, int *, void *)); - -long SSL_session_reused(SSL *); - -/* The following were macros in 0.9.8e. Once we drop support for RHEL/CentOS 5 - we should move these back to FUNCTIONS. */ -void SSL_CTX_set_info_callback(SSL_CTX *, void (*)(const SSL *, int, int)); -void (*SSL_CTX_get_info_callback(SSL_CTX *))(const SSL *, int, int); -/* This function does not exist in 0.9.8e. Once we drop support for - RHEL/CentOS 5 this can be moved back to FUNCTIONS. */ -SSL_CTX *SSL_set_SSL_CTX(SSL *, SSL_CTX *); - -const SSL_METHOD* Cryptography_SSL_CTX_get_method(const SSL_CTX*); - -/* NPN APIs were introduced in OpenSSL 1.0.1. To continue to support earlier - * versions some special handling of these is necessary. - */ -void SSL_CTX_set_next_protos_advertised_cb(SSL_CTX *, - int (*)(SSL *, - const unsigned char **, - unsigned int *, - void *), - void *); -void SSL_CTX_set_next_proto_select_cb(SSL_CTX *, - int (*)(SSL *, - unsigned char **, - unsigned char *, - const unsigned char *, - unsigned int, - void *), - void *); -int SSL_select_next_proto(unsigned char **, unsigned char *, - const unsigned char *, unsigned int, - const unsigned char *, unsigned int); -void SSL_get0_next_proto_negotiated(const SSL *, - const unsigned char **, unsigned *); - -int sk_SSL_CIPHER_num(Cryptography_STACK_OF_SSL_CIPHER *); -SSL_CIPHER *sk_SSL_CIPHER_value(Cryptography_STACK_OF_SSL_CIPHER *, int); - -/* ALPN APIs were introduced in OpenSSL 1.0.2. To continue to support earlier - * versions some special handling of these is necessary. - */ -int SSL_CTX_set_alpn_protos(SSL_CTX *, const unsigned char*, unsigned); -int SSL_set_alpn_protos(SSL *, const unsigned char*, unsigned); -void SSL_CTX_set_alpn_select_cb(SSL_CTX *, - int (*) (SSL *, - const unsigned char **, - unsigned char *, - const unsigned char *, - unsigned int, - void *), - void *); -void SSL_get0_alpn_selected(const SSL *, const unsigned char **, unsigned *); -""" - -CUSTOMIZATIONS = """ -/** Secure renegotiation is supported in OpenSSL >= 0.9.8m - * But some Linux distributions have back ported some features. - */ -#ifndef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION -static const long Cryptography_HAS_SECURE_RENEGOTIATION = 0; -long (*SSL_get_secure_renegotiation_support)(SSL *) = NULL; -const long SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION = 0; -const long SSL_OP_LEGACY_SERVER_CONNECT = 0; -#else -static const long Cryptography_HAS_SECURE_RENEGOTIATION = 1; -#endif -#ifdef OPENSSL_NO_SSL2 -static const long Cryptography_HAS_SSL2 = 0; -SSL_METHOD* (*SSLv2_method)(void) = NULL; -SSL_METHOD* (*SSLv2_client_method)(void) = NULL; -SSL_METHOD* (*SSLv2_server_method)(void) = NULL; -#else -static const long Cryptography_HAS_SSL2 = 1; -#endif - -#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME -static const long Cryptography_HAS_TLSEXT_HOSTNAME = 1; -#else -static const long Cryptography_HAS_TLSEXT_HOSTNAME = 0; -void (*SSL_set_tlsext_host_name)(SSL *, char *) = NULL; -const char* (*SSL_get_servername)(const SSL *, const int) = NULL; -void (*SSL_CTX_set_tlsext_servername_callback)( - SSL_CTX *, - int (*)(const SSL *, int *, void *)) = NULL; -#endif - -#ifdef SSL_MODE_RELEASE_BUFFERS -static const long Cryptography_HAS_RELEASE_BUFFERS = 1; -#else -static const long Cryptography_HAS_RELEASE_BUFFERS = 0; -const long SSL_MODE_RELEASE_BUFFERS = 0; -#endif - -#ifdef SSL_OP_NO_COMPRESSION -static const long Cryptography_HAS_OP_NO_COMPRESSION = 1; -#else -static const long Cryptography_HAS_OP_NO_COMPRESSION = 0; -const long SSL_OP_NO_COMPRESSION = 0; -#endif - -#ifdef SSL_OP_NO_TLSv1_1 -static const long Cryptography_HAS_TLSv1_1 = 1; -#else -static const long Cryptography_HAS_TLSv1_1 = 0; -static const long SSL_OP_NO_TLSv1_1 = 0; -SSL_METHOD* (*TLSv1_1_method)(void) = NULL; -SSL_METHOD* (*TLSv1_1_client_method)(void) = NULL; -SSL_METHOD* (*TLSv1_1_server_method)(void) = NULL; -#endif - -#ifdef SSL_OP_NO_TLSv1_2 -static const long Cryptography_HAS_TLSv1_2 = 1; -#else -static const long Cryptography_HAS_TLSv1_2 = 0; -static const long SSL_OP_NO_TLSv1_2 = 0; -SSL_METHOD* (*TLSv1_2_method)(void) = NULL; -SSL_METHOD* (*TLSv1_2_client_method)(void) = NULL; -SSL_METHOD* (*TLSv1_2_server_method)(void) = NULL; -#endif - -#ifdef SSL_OP_MSIE_SSLV2_RSA_PADDING -static const long Cryptography_HAS_SSL_OP_MSIE_SSLV2_RSA_PADDING = 1; -#else -static const long Cryptography_HAS_SSL_OP_MSIE_SSLV2_RSA_PADDING = 0; -const long SSL_OP_MSIE_SSLV2_RSA_PADDING = 0; -#endif - -#ifdef OPENSSL_NO_EC -long (*SSL_CTX_set_tmp_ecdh)(SSL_CTX *, EC_KEY *) = NULL; -#endif - -#ifdef SSL_OP_NO_TICKET -static const long Cryptography_HAS_SSL_OP_NO_TICKET = 1; -#else -static const long Cryptography_HAS_SSL_OP_NO_TICKET = 0; -const long SSL_OP_NO_TICKET = 0; -#endif - -/* OpenSSL 0.9.8f+ */ -#if OPENSSL_VERSION_NUMBER >= 0x00908070L -static const long Cryptography_HAS_SSL_SET_SSL_CTX = 1; -#else -static const long Cryptography_HAS_SSL_SET_SSL_CTX = 0; -static const long TLSEXT_NAMETYPE_host_name = 0; -SSL_CTX *(*SSL_set_SSL_CTX)(SSL *, SSL_CTX *) = NULL; -#endif - -/* NetBSD shipped without including d1_meth.c. This workaround checks to see - if the version of NetBSD we're currently running on is old enough to - have the bug and provides an empty implementation so we can link and - then remove the function from the ffi object. */ -#ifdef __NetBSD__ -# include -# if (__NetBSD_Version__ < 699003800) -static const long Cryptography_HAS_NETBSD_D1_METH = 0; -const SSL_METHOD *DTLSv1_method(void) { - return NULL; -} -# else -static const long Cryptography_HAS_NETBSD_D1_METH = 1; -# endif -#else -static const long Cryptography_HAS_NETBSD_D1_METH = 1; -#endif - -/* Workaround for #794 caused by cffi const** bug. */ -const SSL_METHOD* Cryptography_SSL_CTX_get_method(const SSL_CTX* ctx) { - return ctx->method; -} - -/* Because OPENSSL defines macros that claim lack of support for things, rather - * than macros that claim support for things, we need to do a version check in - * addition to a definition check. NPN was added in 1.0.1: for any version - * before that, there is no compatibility. - */ -#if defined(OPENSSL_NO_NEXTPROTONEG) || OPENSSL_VERSION_NUMBER < 0x1000100fL -static const long Cryptography_HAS_NEXTPROTONEG = 0; -void (*SSL_CTX_set_next_protos_advertised_cb)(SSL_CTX *, - int (*)(SSL *, - const unsigned char **, - unsigned int *, - void *), - void *) = NULL; -void (*SSL_CTX_set_next_proto_select_cb)(SSL_CTX *, - int (*)(SSL *, - unsigned char **, - unsigned char *, - const unsigned char *, - unsigned int, - void *), - void *) = NULL; -int (*SSL_select_next_proto)(unsigned char **, unsigned char *, - const unsigned char *, unsigned int, - const unsigned char *, unsigned int) = NULL; -void (*SSL_get0_next_proto_negotiated)(const SSL *, - const unsigned char **, - unsigned *) = NULL; -#else -static const long Cryptography_HAS_NEXTPROTONEG = 1; -#endif - -/* ALPN was added in OpenSSL 1.0.2. */ -#if OPENSSL_VERSION_NUMBER < 0x10002001L -int (*SSL_CTX_set_alpn_protos)(SSL_CTX *, - const unsigned char*, - unsigned) = NULL; -int (*SSL_set_alpn_protos)(SSL *, const unsigned char*, unsigned) = NULL; -void (*SSL_CTX_set_alpn_select_cb)(SSL_CTX *, - int (*) (SSL *, - const unsigned char **, - unsigned char *, - const unsigned char *, - unsigned int, - void *), - void *) = NULL; -void (*SSL_get0_alpn_selected)(const SSL *, - const unsigned char **, - unsigned *) = NULL; -static const long Cryptography_HAS_ALPN = 0; -#else -static const long Cryptography_HAS_ALPN = 1; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_TLSv1_1": [ - "SSL_OP_NO_TLSv1_1", - "TLSv1_1_method", - "TLSv1_1_server_method", - "TLSv1_1_client_method", - ], - - "Cryptography_HAS_TLSv1_2": [ - "SSL_OP_NO_TLSv1_2", - "TLSv1_2_method", - "TLSv1_2_server_method", - "TLSv1_2_client_method", - ], - - "Cryptography_HAS_SSL2": [ - "SSLv2_method", - "SSLv2_client_method", - "SSLv2_server_method", - ], - - "Cryptography_HAS_TLSEXT_HOSTNAME": [ - "SSL_set_tlsext_host_name", - "SSL_get_servername", - "SSL_CTX_set_tlsext_servername_callback", - ], - - "Cryptography_HAS_RELEASE_BUFFERS": [ - "SSL_MODE_RELEASE_BUFFERS", - ], - - "Cryptography_HAS_OP_NO_COMPRESSION": [ - "SSL_OP_NO_COMPRESSION", - ], - - "Cryptography_HAS_SSL_OP_MSIE_SSLV2_RSA_PADDING": [ - "SSL_OP_MSIE_SSLV2_RSA_PADDING", - ], - - "Cryptography_HAS_EC": [ - "SSL_CTX_set_tmp_ecdh", - ], - - "Cryptography_HAS_SSL_OP_NO_TICKET": [ - "SSL_OP_NO_TICKET", - ], - - "Cryptography_HAS_SSL_SET_SSL_CTX": [ - "SSL_set_SSL_CTX", - "TLSEXT_NAMETYPE_host_name", - ], - - "Cryptography_HAS_NETBSD_D1_METH": [ - "DTLSv1_method", - ], - - "Cryptography_HAS_NEXTPROTONEG": [ - "SSL_CTX_set_next_protos_advertised_cb", - "SSL_CTX_set_next_proto_select_cb", - "SSL_select_next_proto", - "SSL_get0_next_proto_negotiated", - ], - - "Cryptography_HAS_SECURE_RENEGOTIATION": [ - "SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION", - "SSL_OP_LEGACY_SERVER_CONNECT", - "SSL_get_secure_renegotiation_support", - ], - - "Cryptography_HAS_ALPN": [ - "SSL_CTX_set_alpn_protos", - "SSL_set_alpn_protos", - "SSL_CTX_set_alpn_select_cb", - "SSL_get0_alpn_selected", - ] -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509.py deleted file mode 100644 index b74c118..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509.py +++ /dev/null @@ -1,271 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include - -/* - * This is part of a work-around for the difficulty cffi has in dealing with - * `STACK_OF(foo)` as the name of a type. We invent a new, simpler name that - * will be an alias for this type and use the alias throughout. This works - * together with another opaque typedef for the same name in the TYPES section. - * Note that the result is an opaque type. - */ -typedef STACK_OF(X509) Cryptography_STACK_OF_X509; -typedef STACK_OF(X509_CRL) Cryptography_STACK_OF_X509_CRL; -typedef STACK_OF(X509_REVOKED) Cryptography_STACK_OF_X509_REVOKED; -""" - -TYPES = """ -typedef ... Cryptography_STACK_OF_X509; -typedef ... Cryptography_STACK_OF_X509_CRL; -typedef ... Cryptography_STACK_OF_X509_REVOKED; - -typedef struct { - ASN1_OBJECT *algorithm; - ...; -} X509_ALGOR; - -typedef ... X509_ATTRIBUTE; - -typedef struct { - X509_ALGOR *signature; - ...; -} X509_CINF; - -typedef struct { - ASN1_OBJECT *object; - ASN1_BOOLEAN critical; - ASN1_OCTET_STRING *value; -} X509_EXTENSION; - -typedef ... X509_EXTENSIONS; - -typedef ... X509_REQ; - -typedef struct { - ASN1_INTEGER *serialNumber; - ASN1_TIME *revocationDate; - X509_EXTENSIONS *extensions; - int sequence; - ...; -} X509_REVOKED; - -typedef struct { - Cryptography_STACK_OF_X509_REVOKED *revoked; - ...; -} X509_CRL_INFO; - -typedef struct { - X509_CRL_INFO *crl; - ...; -} X509_CRL; - -typedef struct { - X509_CINF *cert_info; - ...; -} X509; - -typedef ... NETSCAPE_SPKI; -""" - -FUNCTIONS = """ -X509 *X509_new(void); -void X509_free(X509 *); -X509 *X509_dup(X509 *); - -int X509_print_ex(BIO *, X509 *, unsigned long, unsigned long); - -int X509_set_version(X509 *, long); - -EVP_PKEY *X509_get_pubkey(X509 *); -int X509_set_pubkey(X509 *, EVP_PKEY *); - -unsigned char *X509_alias_get0(X509 *, int *); -int X509_sign(X509 *, EVP_PKEY *, const EVP_MD *); - -int X509_digest(const X509 *, const EVP_MD *, unsigned char *, unsigned int *); - -ASN1_TIME *X509_gmtime_adj(ASN1_TIME *, long); - -unsigned long X509_subject_name_hash(X509 *); - -X509_NAME *X509_get_subject_name(X509 *); -int X509_set_subject_name(X509 *, X509_NAME *); - -X509_NAME *X509_get_issuer_name(X509 *); -int X509_set_issuer_name(X509 *, X509_NAME *); - -int X509_get_ext_count(X509 *); -int X509_add_ext(X509 *, X509_EXTENSION *, int); -X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *); -X509_EXTENSION *X509_get_ext(X509 *, int); -int X509_EXTENSION_get_critical(X509_EXTENSION *); -ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *); -void X509_EXTENSION_free(X509_EXTENSION *); - -int X509_REQ_set_version(X509_REQ *, long); -X509_REQ *X509_REQ_new(void); -void X509_REQ_free(X509_REQ *); -int X509_REQ_set_pubkey(X509_REQ *, EVP_PKEY *); -int X509_REQ_sign(X509_REQ *, EVP_PKEY *, const EVP_MD *); -int X509_REQ_verify(X509_REQ *, EVP_PKEY *); -EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *); -int X509_REQ_print_ex(BIO *, X509_REQ *, unsigned long, unsigned long); - -int X509V3_EXT_print(BIO *, X509_EXTENSION *, unsigned long, int); -ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *); - -X509_REVOKED *X509_REVOKED_new(void); -void X509_REVOKED_free(X509_REVOKED *); - -int X509_REVOKED_set_serialNumber(X509_REVOKED *, ASN1_INTEGER *); - -int X509_REVOKED_add1_ext_i2d(X509_REVOKED *, int, void *, int, unsigned long); - -X509_CRL *d2i_X509_CRL_bio(BIO *, X509_CRL **); -X509_CRL *X509_CRL_new(void); -void X509_CRL_free(X509_CRL *); -int X509_CRL_add0_revoked(X509_CRL *, X509_REVOKED *); -int i2d_X509_CRL_bio(BIO *, X509_CRL *); -int X509_CRL_print(BIO *, X509_CRL *); -int X509_CRL_set_issuer_name(X509_CRL *, X509_NAME *); -int X509_CRL_sign(X509_CRL *, EVP_PKEY *, const EVP_MD *); - -int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *, EVP_PKEY *); -int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *, EVP_PKEY *, const EVP_MD *); -char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *); -EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *); -int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *, EVP_PKEY *); -NETSCAPE_SPKI *NETSCAPE_SPKI_new(void); -void NETSCAPE_SPKI_free(NETSCAPE_SPKI *); - -/* ASN1 serialization */ -int i2d_X509_bio(BIO *, X509 *); -X509 *d2i_X509_bio(BIO *, X509 **); - -int i2d_X509_REQ_bio(BIO *, X509_REQ *); -X509_REQ *d2i_X509_REQ_bio(BIO *, X509_REQ **); - -int i2d_PrivateKey_bio(BIO *, EVP_PKEY *); -EVP_PKEY *d2i_PrivateKey_bio(BIO *, EVP_PKEY **); -int i2d_PUBKEY_bio(BIO *, EVP_PKEY *); -EVP_PKEY *d2i_PUBKEY_bio(BIO *, EVP_PKEY **); - -ASN1_INTEGER *X509_get_serialNumber(X509 *); -int X509_set_serialNumber(X509 *, ASN1_INTEGER *); - -const char *X509_verify_cert_error_string(long); - -const char *X509_get_default_cert_area(void); -const char *X509_get_default_cert_dir(void); -const char *X509_get_default_cert_file(void); -const char *X509_get_default_cert_dir_env(void); -const char *X509_get_default_cert_file_env(void); -const char *X509_get_default_private_dir(void); - -int i2d_RSA_PUBKEY(RSA *, unsigned char **); -RSA *d2i_RSA_PUBKEY(RSA **, const unsigned char **, long); -RSA *d2i_RSAPublicKey(RSA **, const unsigned char **, long); -RSA *d2i_RSAPrivateKey(RSA **, const unsigned char **, long); -int i2d_DSA_PUBKEY(DSA *, unsigned char **); -DSA *d2i_DSA_PUBKEY(DSA **, const unsigned char **, long); -DSA *d2i_DSAPublicKey(DSA **, const unsigned char **, long); -DSA *d2i_DSAPrivateKey(DSA **, const unsigned char **, long); - -RSA *d2i_RSAPrivateKey_bio(BIO *, RSA **); -int i2d_RSAPrivateKey_bio(BIO *, RSA *); -RSA *d2i_RSAPublicKey_bio(BIO *, RSA **); -int i2d_RSAPublicKey_bio(BIO *, RSA *); -RSA *d2i_RSA_PUBKEY_bio(BIO *, RSA **); -int i2d_RSA_PUBKEY_bio(BIO *, RSA *); -DSA *d2i_DSA_PUBKEY_bio(BIO *, DSA **); -int i2d_DSA_PUBKEY_bio(BIO *, DSA *); -DSA *d2i_DSAPrivateKey_bio(BIO *, DSA **); -int i2d_DSAPrivateKey_bio(BIO *, DSA *); -""" - -MACROS = """ -long X509_get_version(X509 *); - -ASN1_TIME *X509_get_notBefore(X509 *); -ASN1_TIME *X509_get_notAfter(X509 *); - -long X509_REQ_get_version(X509_REQ *); -X509_NAME *X509_REQ_get_subject_name(X509_REQ *); - -Cryptography_STACK_OF_X509 *sk_X509_new_null(void); -void sk_X509_free(Cryptography_STACK_OF_X509 *); -int sk_X509_num(Cryptography_STACK_OF_X509 *); -int sk_X509_push(Cryptography_STACK_OF_X509 *, X509 *); -X509 *sk_X509_value(Cryptography_STACK_OF_X509 *, int); - -X509_EXTENSIONS *sk_X509_EXTENSION_new_null(void); -int sk_X509_EXTENSION_num(X509_EXTENSIONS *); -X509_EXTENSION *sk_X509_EXTENSION_value(X509_EXTENSIONS *, int); -int sk_X509_EXTENSION_push(X509_EXTENSIONS *, X509_EXTENSION *); -X509_EXTENSION *sk_X509_EXTENSION_delete(X509_EXTENSIONS *, int); -void sk_X509_EXTENSION_free(X509_EXTENSIONS *); - -int sk_X509_REVOKED_num(Cryptography_STACK_OF_X509_REVOKED *); -X509_REVOKED *sk_X509_REVOKED_value(Cryptography_STACK_OF_X509_REVOKED *, int); - -int i2d_RSAPublicKey(RSA *, unsigned char **); -int i2d_RSAPrivateKey(RSA *, unsigned char **); -int i2d_DSAPublicKey(DSA *, unsigned char **); -int i2d_DSAPrivateKey(DSA *, unsigned char **); - -/* These aren't macros these arguments are all const X on openssl > 1.0.x */ -int X509_CRL_set_lastUpdate(X509_CRL *, ASN1_TIME *); -int X509_CRL_set_nextUpdate(X509_CRL *, ASN1_TIME *); - -/* These use STACK_OF(X509_EXTENSION) in 0.9.8e. Once we drop support for - RHEL/CentOS 5 we should move these back to FUNCTIONS. */ -int X509_REQ_add_extensions(X509_REQ *, X509_EXTENSIONS *); -X509_EXTENSIONS *X509_REQ_get_extensions(X509_REQ *); - -int i2d_EC_PUBKEY(EC_KEY *, unsigned char **); -EC_KEY *d2i_EC_PUBKEY(EC_KEY **, const unsigned char **, long); -EC_KEY *d2i_EC_PUBKEY_bio(BIO *, EC_KEY **); -int i2d_EC_PUBKEY_bio(BIO *, EC_KEY *); -EC_KEY *d2i_ECPrivateKey_bio(BIO *, EC_KEY **); -int i2d_ECPrivateKey_bio(BIO *, EC_KEY *); -""" - -CUSTOMIZATIONS = """ -/* OpenSSL 0.9.8e does not have this definition. */ -#if OPENSSL_VERSION_NUMBER <= 0x0090805fL -typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; -#endif -#ifdef OPENSSL_NO_EC -int (*i2d_EC_PUBKEY)(EC_KEY *, unsigned char **) = NULL; -EC_KEY *(*d2i_EC_PUBKEY)(EC_KEY **, const unsigned char **, long) = NULL; -EC_KEY *(*d2i_EC_PUBKEY_bio)(BIO *, EC_KEY **) = NULL; -int (*i2d_EC_PUBKEY_bio)(BIO *, EC_KEY *) = NULL; -EC_KEY *(*d2i_ECPrivateKey_bio)(BIO *, EC_KEY **) = NULL; -int (*i2d_ECPrivateKey_bio)(BIO *, EC_KEY *) = NULL; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_EC": [ - "i2d_EC_PUBKEY", - "d2i_EC_PUBKEY", - "d2i_EC_PUBKEY_bio", - "i2d_EC_PUBKEY_bio", - "d2i_ECPrivateKey_bio", - "i2d_ECPrivateKey_bio", - ] -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509_vfy.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509_vfy.py deleted file mode 100644 index 601926c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509_vfy.py +++ /dev/null @@ -1,336 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include - -/* - * This is part of a work-around for the difficulty cffi has in dealing with - * `STACK_OF(foo)` as the name of a type. We invent a new, simpler name that - * will be an alias for this type and use the alias throughout. This works - * together with another opaque typedef for the same name in the TYPES section. - * Note that the result is an opaque type. - */ -typedef STACK_OF(ASN1_OBJECT) Cryptography_STACK_OF_ASN1_OBJECT; -""" - -TYPES = """ -static const long Cryptography_HAS_102_VERIFICATION_ERROR_CODES; -static const long Cryptography_HAS_102_VERIFICATION_PARAMS; -static const long Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST; -static const long Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN; -static const long Cryptography_HAS_100_VERIFICATION_ERROR_CODES; -static const long Cryptography_HAS_100_VERIFICATION_PARAMS; -static const long Cryptography_HAS_X509_V_FLAG_CHECK_SS_SIGNATURE; - -typedef ... Cryptography_STACK_OF_ASN1_OBJECT; - -typedef ... X509_STORE; -typedef ... X509_STORE_CTX; -typedef ... X509_VERIFY_PARAM; - -/* While these are defined in the source as ints, they're tagged here - as longs, just in case they ever grow to large, such as what we saw - with OP_ALL. */ - -/* Verification error codes */ -static const int X509_V_OK; -static const int X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT; -static const int X509_V_ERR_UNABLE_TO_GET_CRL; -static const int X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE; -static const int X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE; -static const int X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY; -static const int X509_V_ERR_CERT_SIGNATURE_FAILURE; -static const int X509_V_ERR_CRL_SIGNATURE_FAILURE; -static const int X509_V_ERR_CERT_NOT_YET_VALID; -static const int X509_V_ERR_CERT_HAS_EXPIRED; -static const int X509_V_ERR_CRL_NOT_YET_VALID; -static const int X509_V_ERR_CRL_HAS_EXPIRED; -static const int X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; -static const int X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; -static const int X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD; -static const int X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD; -static const int X509_V_ERR_OUT_OF_MEM; -static const int X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; -static const int X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN; -static const int X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; -static const int X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE; -static const int X509_V_ERR_CERT_CHAIN_TOO_LONG; -static const int X509_V_ERR_CERT_REVOKED; -static const int X509_V_ERR_INVALID_CA; -static const int X509_V_ERR_PATH_LENGTH_EXCEEDED; -static const int X509_V_ERR_INVALID_PURPOSE; -static const int X509_V_ERR_CERT_UNTRUSTED; -static const int X509_V_ERR_CERT_REJECTED; -static const int X509_V_ERR_SUBJECT_ISSUER_MISMATCH; -static const int X509_V_ERR_AKID_SKID_MISMATCH; -static const int X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH; -static const int X509_V_ERR_KEYUSAGE_NO_CERTSIGN; -static const int X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER; -static const int X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION; -static const int X509_V_ERR_KEYUSAGE_NO_CRL_SIGN; -static const int X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION; -static const int X509_V_ERR_INVALID_NON_CA; -static const int X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED; -static const int X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE; -static const int X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED; -static const int X509_V_ERR_INVALID_EXTENSION; -static const int X509_V_ERR_INVALID_POLICY_EXTENSION; -static const int X509_V_ERR_NO_EXPLICIT_POLICY; -static const int X509_V_ERR_DIFFERENT_CRL_SCOPE; -static const int X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE; -static const int X509_V_ERR_UNNESTED_RESOURCE; -static const int X509_V_ERR_PERMITTED_VIOLATION; -static const int X509_V_ERR_EXCLUDED_VIOLATION; -static const int X509_V_ERR_SUBTREE_MINMAX; -static const int X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE; -static const int X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX; -static const int X509_V_ERR_UNSUPPORTED_NAME_SYNTAX; -static const int X509_V_ERR_CRL_PATH_VALIDATION_ERROR; -static const int X509_V_ERR_SUITE_B_INVALID_VERSION; -static const int X509_V_ERR_SUITE_B_INVALID_ALGORITHM; -static const int X509_V_ERR_SUITE_B_INVALID_CURVE; -static const int X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM; -static const int X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED; -static const int X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256; -static const int X509_V_ERR_HOSTNAME_MISMATCH; -static const int X509_V_ERR_EMAIL_MISMATCH; -static const int X509_V_ERR_IP_ADDRESS_MISMATCH; -static const int X509_V_ERR_APPLICATION_VERIFICATION; - -/* Verification parameters */ -static const long X509_V_FLAG_CB_ISSUER_CHECK; -static const long X509_V_FLAG_USE_CHECK_TIME; -static const long X509_V_FLAG_CRL_CHECK; -static const long X509_V_FLAG_CRL_CHECK_ALL; -static const long X509_V_FLAG_IGNORE_CRITICAL; -static const long X509_V_FLAG_X509_STRICT; -static const long X509_V_FLAG_ALLOW_PROXY_CERTS; -static const long X509_V_FLAG_POLICY_CHECK; -static const long X509_V_FLAG_EXPLICIT_POLICY; -static const long X509_V_FLAG_INHIBIT_ANY; -static const long X509_V_FLAG_INHIBIT_MAP; -static const long X509_V_FLAG_NOTIFY_POLICY; -static const long X509_V_FLAG_EXTENDED_CRL_SUPPORT; -static const long X509_V_FLAG_USE_DELTAS; -static const long X509_V_FLAG_CHECK_SS_SIGNATURE; -static const long X509_V_FLAG_TRUSTED_FIRST; -static const long X509_V_FLAG_SUITEB_128_LOS_ONLY; -static const long X509_V_FLAG_SUITEB_192_LOS; -static const long X509_V_FLAG_SUITEB_128_LOS; -static const long X509_V_FLAG_PARTIAL_CHAIN; -""" - -FUNCTIONS = """ -int X509_verify_cert(X509_STORE_CTX *); - -/* X509_STORE */ -X509_STORE *X509_STORE_new(void); -void X509_STORE_free(X509_STORE *); -int X509_STORE_add_cert(X509_STORE *, X509 *); - -/* X509_STORE_CTX */ -X509_STORE_CTX *X509_STORE_CTX_new(void); -void X509_STORE_CTX_cleanup(X509_STORE_CTX *); -void X509_STORE_CTX_free(X509_STORE_CTX *); -int X509_STORE_CTX_init(X509_STORE_CTX *, X509_STORE *, X509 *, - Cryptography_STACK_OF_X509 *); -void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *, - Cryptography_STACK_OF_X509 *); -void X509_STORE_CTX_set_cert(X509_STORE_CTX *, X509 *); -void X509_STORE_CTX_set_chain(X509_STORE_CTX *,Cryptography_STACK_OF_X509 *); -X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *); -void X509_STORE_CTX_set0_param(X509_STORE_CTX *, X509_VERIFY_PARAM *); -int X509_STORE_CTX_set_default(X509_STORE_CTX *, const char *); -void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *, - int (*)(int, X509_STORE_CTX *)); -Cryptography_STACK_OF_X509 *X509_STORE_CTX_get_chain(X509_STORE_CTX *); -Cryptography_STACK_OF_X509 *X509_STORE_CTX_get1_chain(X509_STORE_CTX *); -int X509_STORE_CTX_get_error(X509_STORE_CTX *); -void X509_STORE_CTX_set_error(X509_STORE_CTX *, int); -int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *); -X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *); -int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *, int, void *); -void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *, int); - -/* X509_VERIFY_PARAM */ -X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); -int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *, unsigned long); -int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *, unsigned long); -unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *); -int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *, int); -int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *, int); -void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *, time_t); -int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *, ASN1_OBJECT *); -int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *, - Cryptography_STACK_OF_ASN1_OBJECT *); -void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *, int); -int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *); -""" - -MACROS = """ -/* X509_STORE_CTX */ -void X509_STORE_CTX_set0_crls(X509_STORE_CTX *, - Cryptography_STACK_OF_X509_CRL *); - -/* X509_VERIFY_PARAM */ -int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *, const char *, - size_t); -void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *, unsigned int); -int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *, const char *, - size_t); -int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *, const unsigned char *, - size_t); -int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *, const char *); -""" - -CUSTOMIZATIONS = """ -/* OpenSSL 1.0.2+ verification error codes */ -#if OPENSSL_VERSION_NUMBER >= 0x10002000L -static const long Cryptography_HAS_102_VERIFICATION_ERROR_CODES = 1; -#else -static const long Cryptography_HAS_102_VERIFICATION_ERROR_CODES = 0; -static const long X509_V_ERR_SUITE_B_INVALID_VERSION = 0; -static const long X509_V_ERR_SUITE_B_INVALID_ALGORITHM = 0; -static const long X509_V_ERR_SUITE_B_INVALID_CURVE = 0; -static const long X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM = 0; -static const long X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED = 0; -static const long X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 = 0; -static const long X509_V_ERR_HOSTNAME_MISMATCH = 0; -static const long X509_V_ERR_EMAIL_MISMATCH = 0; -static const long X509_V_ERR_IP_ADDRESS_MISMATCH = 0; -#endif - -/* OpenSSL 1.0.2+ verification parameters */ -#if OPENSSL_VERSION_NUMBER >= 0x10002000L -static const long Cryptography_HAS_102_VERIFICATION_PARAMS = 1; -#else -static const long Cryptography_HAS_102_VERIFICATION_PARAMS = 0; -/* X509_V_FLAG_TRUSTED_FIRST is also new in 1.0.2+, but it is added separately - below because it shows up in some earlier 3rd party OpenSSL packages. */ -static const long X509_V_FLAG_SUITEB_128_LOS_ONLY = 0; -static const long X509_V_FLAG_SUITEB_192_LOS = 0; -static const long X509_V_FLAG_SUITEB_128_LOS = 0; - -int (*X509_VERIFY_PARAM_set1_host)(X509_VERIFY_PARAM *, const char *, - size_t) = NULL; -int (*X509_VERIFY_PARAM_set1_email)(X509_VERIFY_PARAM *, const char *, - size_t) = NULL; -int (*X509_VERIFY_PARAM_set1_ip)(X509_VERIFY_PARAM *, const unsigned char *, - size_t) = NULL; -int (*X509_VERIFY_PARAM_set1_ip_asc)(X509_VERIFY_PARAM *, const char *) = NULL; -void (*X509_VERIFY_PARAM_set_hostflags)(X509_VERIFY_PARAM *, - unsigned int) = NULL; -#endif - -/* OpenSSL 1.0.2+ or Solaris's backport */ -#ifdef X509_V_FLAG_PARTIAL_CHAIN -static const long Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN = 1; -#else -static const long Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN = 0; -static const long X509_V_FLAG_PARTIAL_CHAIN = 0; -#endif - -/* OpenSSL 1.0.2+, *or* Fedora 20's flavor of OpenSSL 1.0.1e... */ -#ifdef X509_V_FLAG_TRUSTED_FIRST -static const long Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST = 1; -#else -static const long Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST = 0; -static const long X509_V_FLAG_TRUSTED_FIRST = 0; -#endif - -/* OpenSSL 1.0.0+ verification error codes */ -#if OPENSSL_VERSION_NUMBER >= 0x10000000L -static const long Cryptography_HAS_100_VERIFICATION_ERROR_CODES = 1; -#else -static const long Cryptography_HAS_100_VERIFICATION_ERROR_CODES = 0; -static const long X509_V_ERR_DIFFERENT_CRL_SCOPE = 0; -static const long X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE = 0; -static const long X509_V_ERR_PERMITTED_VIOLATION = 0; -static const long X509_V_ERR_EXCLUDED_VIOLATION = 0; -static const long X509_V_ERR_SUBTREE_MINMAX = 0; -static const long X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE = 0; -static const long X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX = 0; -static const long X509_V_ERR_UNSUPPORTED_NAME_SYNTAX = 0; -static const long X509_V_ERR_CRL_PATH_VALIDATION_ERROR = 0; -#endif - -/* OpenSSL 1.0.0+ verification parameters */ -#if OPENSSL_VERSION_NUMBER >= 0x10000000L -static const long Cryptography_HAS_100_VERIFICATION_PARAMS = 1; -#else -static const long Cryptography_HAS_100_VERIFICATION_PARAMS = 0; -static const long X509_V_FLAG_EXTENDED_CRL_SUPPORT = 0; -static const long X509_V_FLAG_USE_DELTAS = 0; -#endif - -/* OpenSSL 0.9.8recent+ */ -#ifdef X509_V_FLAG_CHECK_SS_SIGNATURE -static const long Cryptography_HAS_X509_V_FLAG_CHECK_SS_SIGNATURE = 1; -#else -static const long Cryptography_HAS_X509_V_FLAG_CHECK_SS_SIGNATURE = 0; -static const long X509_V_FLAG_CHECK_SS_SIGNATURE = 0; -#endif -""" - -CONDITIONAL_NAMES = { - "Cryptography_HAS_102_VERIFICATION_ERROR_CODES": [ - 'X509_V_ERR_SUITE_B_INVALID_VERSION', - 'X509_V_ERR_SUITE_B_INVALID_ALGORITHM', - 'X509_V_ERR_SUITE_B_INVALID_CURVE', - 'X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM', - 'X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED', - 'X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256', - 'X509_V_ERR_HOSTNAME_MISMATCH', - 'X509_V_ERR_EMAIL_MISMATCH', - 'X509_V_ERR_IP_ADDRESS_MISMATCH' - ], - "Cryptography_HAS_102_VERIFICATION_PARAMS": [ - "X509_V_FLAG_SUITEB_128_LOS_ONLY", - "X509_V_FLAG_SUITEB_192_LOS", - "X509_V_FLAG_SUITEB_128_LOS", - "X509_VERIFY_PARAM_set1_host", - "X509_VERIFY_PARAM_set1_email", - "X509_VERIFY_PARAM_set1_ip", - "X509_VERIFY_PARAM_set1_ip_asc", - "X509_VERIFY_PARAM_set_hostflags", - ], - "Cryptography_HAS_X509_V_FLAG_TRUSTED_FIRST": [ - "X509_V_FLAG_TRUSTED_FIRST", - ], - "Cryptography_HAS_X509_V_FLAG_PARTIAL_CHAIN": [ - "X509_V_FLAG_PARTIAL_CHAIN", - ], - "Cryptography_HAS_100_VERIFICATION_ERROR_CODES": [ - 'X509_V_ERR_DIFFERENT_CRL_SCOPE', - 'X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE', - 'X509_V_ERR_UNNESTED_RESOURCE', - 'X509_V_ERR_PERMITTED_VIOLATION', - 'X509_V_ERR_EXCLUDED_VIOLATION', - 'X509_V_ERR_SUBTREE_MINMAX', - 'X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE', - 'X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX', - 'X509_V_ERR_UNSUPPORTED_NAME_SYNTAX', - 'X509_V_ERR_CRL_PATH_VALIDATION_ERROR', - ], - "Cryptography_HAS_100_VERIFICATION_PARAMS": [ - "Cryptography_HAS_100_VERIFICATION_PARAMS", - "X509_V_FLAG_EXTENDED_CRL_SUPPORT", - "X509_V_FLAG_USE_DELTAS", - ], - "Cryptography_HAS_X509_V_FLAG_CHECK_SS_SIGNATURE": [ - "X509_V_FLAG_CHECK_SS_SIGNATURE", - ] -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509name.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509name.py deleted file mode 100644 index 50abee2..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509name.py +++ /dev/null @@ -1,61 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include - -/* - * See the comment above Cryptography_STACK_OF_X509 in x509.py - */ -typedef STACK_OF(X509_NAME) Cryptography_STACK_OF_X509_NAME; -""" - -TYPES = """ -typedef ... X509_NAME; -typedef ... X509_NAME_ENTRY; -typedef ... Cryptography_STACK_OF_X509_NAME; -""" - -FUNCTIONS = """ -int X509_NAME_entry_count(X509_NAME *); -X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *, int); -ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *); -ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *); -unsigned long X509_NAME_hash(X509_NAME *); - -int i2d_X509_NAME(X509_NAME *, unsigned char **); -int X509_NAME_add_entry_by_NID(X509_NAME *, int, int, unsigned char *, - int, int, int); -X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *, int); -void X509_NAME_ENTRY_free(X509_NAME_ENTRY *); -int X509_NAME_get_index_by_NID(X509_NAME *, int, int); -int X509_NAME_cmp(const X509_NAME *, const X509_NAME *); -char *X509_NAME_oneline(X509_NAME *, char *, int); -X509_NAME *X509_NAME_dup(X509_NAME *); -void X509_NAME_free(X509_NAME *); -""" - -MACROS = """ -Cryptography_STACK_OF_X509_NAME *sk_X509_NAME_new_null(void); -int sk_X509_NAME_num(Cryptography_STACK_OF_X509_NAME *); -int sk_X509_NAME_push(Cryptography_STACK_OF_X509_NAME *, X509_NAME *); -X509_NAME *sk_X509_NAME_value(Cryptography_STACK_OF_X509_NAME *, int); -void sk_X509_NAME_free(Cryptography_STACK_OF_X509_NAME *); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509v3.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509v3.py deleted file mode 100644 index cf4be1f..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/openssl/x509v3.py +++ /dev/null @@ -1,103 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -INCLUDES = """ -#include -""" - -TYPES = """ -typedef struct { - X509 *issuer_cert; - X509 *subject_cert; - ...; -} X509V3_CTX; - -typedef void * (*X509V3_EXT_D2I)(void *, const unsigned char **, long); - -typedef struct { - ASN1_ITEM_EXP *it; - X509V3_EXT_D2I d2i; - ...; -} X509V3_EXT_METHOD; - -static const int GEN_OTHERNAME; -static const int GEN_EMAIL; -static const int GEN_X400; -static const int GEN_DNS; -static const int GEN_URI; -static const int GEN_DIRNAME; -static const int GEN_EDIPARTY; -static const int GEN_IPADD; -static const int GEN_RID; - -typedef struct { - ...; -} OTHERNAME; - -typedef struct { - ...; -} EDIPARTYNAME; - -typedef struct { - int type; - union { - char *ptr; - OTHERNAME *otherName; /* otherName */ - ASN1_IA5STRING *rfc822Name; - ASN1_IA5STRING *dNSName; - ASN1_TYPE *x400Address; - X509_NAME *directoryName; - EDIPARTYNAME *ediPartyName; - ASN1_IA5STRING *uniformResourceIdentifier; - ASN1_OCTET_STRING *iPAddress; - ASN1_OBJECT *registeredID; - - /* Old names */ - ASN1_OCTET_STRING *ip; /* iPAddress */ - X509_NAME *dirn; /* dirn */ - ASN1_IA5STRING *ia5; /* rfc822Name, dNSName, */ - /* uniformResourceIdentifier */ - ASN1_OBJECT *rid; /* registeredID */ - ASN1_TYPE *other; /* x400Address */ - } d; - ...; -} GENERAL_NAME; - -typedef struct stack_st_GENERAL_NAME GENERAL_NAMES; -""" - -FUNCTIONS = """ -void X509V3_set_ctx(X509V3_CTX *, X509 *, X509 *, X509_REQ *, X509_CRL *, int); -X509_EXTENSION *X509V3_EXT_nconf(CONF *, X509V3_CTX *, char *, char *); -int GENERAL_NAME_print(BIO *, GENERAL_NAME *); -void GENERAL_NAMES_free(GENERAL_NAMES *); -void *X509V3_EXT_d2i(X509_EXTENSION *); -""" - -MACROS = """ -void *X509V3_set_ctx_nodb(X509V3_CTX *); -int sk_GENERAL_NAME_num(struct stack_st_GENERAL_NAME *); -int sk_GENERAL_NAME_push(struct stack_st_GENERAL_NAME *, GENERAL_NAME *); -GENERAL_NAME *sk_GENERAL_NAME_value(struct stack_st_GENERAL_NAME *, int); - -/* These aren't macros these functions are all const X on openssl > 1.0.x */ -const X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *); -const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int); -""" - -CUSTOMIZATIONS = """ -""" - -CONDITIONAL_NAMES = {} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/utils.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/utils.py deleted file mode 100644 index 1c48116..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/bindings/utils.py +++ /dev/null @@ -1,108 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import binascii - -import sys - -import cffi - - -def build_ffi(module_prefix, modules, pre_include="", post_include="", - libraries=[], extra_compile_args=[], extra_link_args=[]): - """ - Modules listed in ``modules`` should have the following attributes: - - * ``INCLUDES``: A string containing C includes. - * ``TYPES``: A string containing C declarations for types. - * ``FUNCTIONS``: A string containing C declarations for functions. - * ``MACROS``: A string containing C declarations for any macros. - * ``CUSTOMIZATIONS``: A string containing arbitrary top-level C code, this - can be used to do things like test for a define and provide an - alternate implementation based on that. - * ``CONDITIONAL_NAMES``: A dict mapping strings of condition names from the - library to a list of names which will not be present without the - condition. - """ - ffi = cffi.FFI() - types = [] - includes = [] - functions = [] - macros = [] - customizations = [] - for name in modules: - module_name = module_prefix + name - __import__(module_name) - module = sys.modules[module_name] - - types.append(module.TYPES) - macros.append(module.MACROS) - functions.append(module.FUNCTIONS) - includes.append(module.INCLUDES) - customizations.append(module.CUSTOMIZATIONS) - - cdef_sources = types + functions + macros - ffi.cdef("\n".join(cdef_sources)) - - # We include functions here so that if we got any of their definitions - # wrong, the underlying C compiler will explode. In C you are allowed - # to re-declare a function if it has the same signature. That is: - # int foo(int); - # int foo(int); - # is legal, but the following will fail to compile: - # int foo(int); - # int foo(short); - source = "\n".join( - [pre_include] + - includes + - [post_include] + - functions + - customizations - ) - lib = ffi.verify( - source=source, - modulename=_create_modulename(cdef_sources, source, sys.version), - libraries=libraries, - ext_package="cryptography", - extra_compile_args=extra_compile_args, - extra_link_args=extra_link_args, - ) - - for name in modules: - module_name = module_prefix + name - module = sys.modules[module_name] - for condition, names in module.CONDITIONAL_NAMES.items(): - if not getattr(lib, condition): - for name in names: - delattr(lib, name) - - return ffi, lib - - -def _create_modulename(cdef_sources, source, sys_version): - """ - cffi creates a modulename internally that incorporates the cffi version. - This will cause cryptography's wheels to break when the version of cffi - the user has does not match what was used when building the wheel. To - resolve this we build our own modulename that uses most of the same code - from cffi but elides the version key. - """ - key = '\x00'.join([sys_version[:3], source] + cdef_sources) - key = key.encode('utf-8') - k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) - k1 = k1.lstrip('0x').rstrip('L') - k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) - k2 = k2.lstrip('0').rstrip('L') - return '_Cryptography_cffi_{0}{1}'.format(k1, k2) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py deleted file mode 100644 index 04b2272..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py +++ /dev/null @@ -1,337 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import warnings - -import six - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.backends.interfaces import DSABackend -from cryptography.hazmat.primitives import interfaces - - -def generate_parameters(key_size, backend): - return backend.generate_dsa_parameters(key_size) - - -def generate_private_key(key_size, backend): - return backend.generate_dsa_private_key_and_parameters(key_size) - - -def _check_dsa_parameters(parameters): - if (utils.bit_length(parameters.p), - utils.bit_length(parameters.q)) not in ( - (1024, 160), - (2048, 256), - (3072, 256)): - raise ValueError("p and q lengths must be " - "one of these pairs (1024, 160) or (2048, 256) " - "or (3072, 256).") - - if not (1 < parameters.g < parameters.p): - raise ValueError("g, p don't satisfy 1 < g < p.") - - -def _check_dsa_private_numbers(numbers): - parameters = numbers.public_numbers.parameter_numbers - _check_dsa_parameters(parameters) - if numbers.x <= 0 or numbers.x >= parameters.q: - raise ValueError("x must be > 0 and < q.") - - if numbers.public_numbers.y != pow(parameters.g, numbers.x, parameters.p): - raise ValueError("y must be equal to (g ** x % p).") - - -@utils.register_interface(interfaces.DSAParameters) -class DSAParameters(object): - def __init__(self, modulus, subgroup_order, generator): - warnings.warn( - "The DSAParameters class is deprecated and will be removed in a " - "future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - _check_dsa_parameters( - DSAParameterNumbers( - p=modulus, - q=subgroup_order, - g=generator - ) - ) - - self._modulus = modulus - self._subgroup_order = subgroup_order - self._generator = generator - - @classmethod - def generate(cls, key_size, backend): - warnings.warn( - "generate is deprecated and will be removed in a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - if not isinstance(backend, DSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement DSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - parameters = backend.generate_dsa_parameters(key_size) - numbers = parameters.parameter_numbers() - return cls( - modulus=numbers.p, - subgroup_order=numbers.q, - generator=numbers.g - ) - - @property - def modulus(self): - return self._modulus - - @property - def subgroup_order(self): - return self._subgroup_order - - @property - def generator(self): - return self._generator - - @property - def p(self): - return self.modulus - - @property - def q(self): - return self.subgroup_order - - @property - def g(self): - return self.generator - - -@utils.register_interface(interfaces.DSAPrivateKey) -class DSAPrivateKey(object): - def __init__(self, modulus, subgroup_order, generator, x, y): - warnings.warn( - "The DSAPrivateKey class is deprecated and will be removed in a " - "future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - if ( - not isinstance(x, six.integer_types) or - not isinstance(y, six.integer_types) - ): - raise TypeError("DSAPrivateKey arguments must be integers.") - - _check_dsa_private_numbers( - DSAPrivateNumbers( - public_numbers=DSAPublicNumbers( - parameter_numbers=DSAParameterNumbers( - p=modulus, - q=subgroup_order, - g=generator - ), - y=y - ), - x=x - ) - ) - - self._modulus = modulus - self._subgroup_order = subgroup_order - self._generator = generator - self._x = x - self._y = y - - @classmethod - def generate(cls, parameters, backend): - warnings.warn( - "generate is deprecated and will be removed in a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - if not isinstance(backend, DSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement DSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - key = backend.generate_dsa_private_key(parameters) - private_numbers = key.private_numbers() - return cls( - modulus=private_numbers.public_numbers.parameter_numbers.p, - subgroup_order=private_numbers.public_numbers.parameter_numbers.q, - generator=private_numbers.public_numbers.parameter_numbers.g, - x=private_numbers.x, - y=private_numbers.public_numbers.y - ) - - def signer(self, algorithm, backend): - if not isinstance(backend, DSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement DSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - return backend.create_dsa_signature_ctx(self, algorithm) - - @property - def key_size(self): - return utils.bit_length(self._modulus) - - def public_key(self): - return DSAPublicKey(self._modulus, self._subgroup_order, - self._generator, self.y) - - @property - def x(self): - return self._x - - @property - def y(self): - return self._y - - def parameters(self): - return DSAParameters(self._modulus, self._subgroup_order, - self._generator) - - -@utils.register_interface(interfaces.DSAPublicKey) -class DSAPublicKey(object): - def __init__(self, modulus, subgroup_order, generator, y): - warnings.warn( - "The DSAPublicKey class is deprecated and will be removed in a " - "future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - _check_dsa_parameters( - DSAParameterNumbers( - p=modulus, - q=subgroup_order, - g=generator - ) - ) - if not isinstance(y, six.integer_types): - raise TypeError("y must be an integer.") - - self._modulus = modulus - self._subgroup_order = subgroup_order - self._generator = generator - self._y = y - - def verifier(self, signature, algorithm, backend): - if not isinstance(backend, DSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement DSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - return backend.create_dsa_verification_ctx(self, signature, - algorithm) - - @property - def key_size(self): - return utils.bit_length(self._modulus) - - @property - def y(self): - return self._y - - def parameters(self): - return DSAParameters(self._modulus, self._subgroup_order, - self._generator) - - -class DSAParameterNumbers(object): - def __init__(self, p, q, g): - if ( - not isinstance(p, six.integer_types) or - not isinstance(q, six.integer_types) or - not isinstance(g, six.integer_types) - ): - raise TypeError( - "DSAParameterNumbers p, q, and g arguments must be integers." - ) - - self._p = p - self._q = q - self._g = g - - @property - def p(self): - return self._p - - @property - def q(self): - return self._q - - @property - def g(self): - return self._g - - def parameters(self, backend): - return backend.load_dsa_parameter_numbers(self) - - -class DSAPublicNumbers(object): - def __init__(self, y, parameter_numbers): - if not isinstance(y, six.integer_types): - raise TypeError("DSAPublicNumbers y argument must be an integer.") - - if not isinstance(parameter_numbers, DSAParameterNumbers): - raise TypeError( - "parameter_numbers must be a DSAParameterNumbers instance." - ) - - self._y = y - self._parameter_numbers = parameter_numbers - - @property - def y(self): - return self._y - - @property - def parameter_numbers(self): - return self._parameter_numbers - - def public_key(self, backend): - return backend.load_dsa_public_numbers(self) - - -class DSAPrivateNumbers(object): - def __init__(self, x, public_numbers): - if not isinstance(x, six.integer_types): - raise TypeError("DSAPrivateNumbers x argument must be an integer.") - - if not isinstance(public_numbers, DSAPublicNumbers): - raise TypeError( - "public_numbers must be a DSAPublicNumbers instance." - ) - self._public_numbers = public_numbers - self._x = x - - @property - def x(self): - return self._x - - @property - def public_numbers(self): - return self._public_numbers - - def private_key(self, backend): - return backend.load_dsa_private_numbers(self) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py deleted file mode 100644 index 6dcf39c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py +++ /dev/null @@ -1,285 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import six - -from cryptography import utils -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT571R1(object): - @property - def name(self): - return "sect571r1" - - @property - def key_size(self): - return 571 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT409R1(object): - @property - def name(self): - return "sect409r1" - - @property - def key_size(self): - return 409 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT283R1(object): - @property - def name(self): - return "sect283r1" - - @property - def key_size(self): - return 283 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT233R1(object): - @property - def name(self): - return "sect233r1" - - @property - def key_size(self): - return 233 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT163R2(object): - @property - def name(self): - return "sect163r2" - - @property - def key_size(self): - return 163 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT571K1(object): - @property - def name(self): - return "sect571k1" - - @property - def key_size(self): - return 571 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT409K1(object): - @property - def name(self): - return "sect409k1" - - @property - def key_size(self): - return 409 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT283K1(object): - @property - def name(self): - return "sect283k1" - - @property - def key_size(self): - return 283 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT233K1(object): - @property - def name(self): - return "sect233k1" - - @property - def key_size(self): - return 233 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECT163K1(object): - @property - def name(self): - return "sect163k1" - - @property - def key_size(self): - return 163 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECP521R1(object): - @property - def name(self): - return "secp521r1" - - @property - def key_size(self): - return 521 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECP384R1(object): - @property - def name(self): - return "secp384r1" - - @property - def key_size(self): - return 384 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECP256R1(object): - @property - def name(self): - return "secp256r1" - - @property - def key_size(self): - return 256 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECP224R1(object): - @property - def name(self): - return "secp224r1" - - @property - def key_size(self): - return 224 - - -@utils.register_interface(interfaces.EllipticCurve) -class SECP192R1(object): - @property - def name(self): - return "secp192r1" - - @property - def key_size(self): - return 192 - - -_CURVE_TYPES = { - "prime192v1": SECP192R1, - "prime256v1": SECP256R1, - - "secp192r1": SECP192R1, - "secp224r1": SECP224R1, - "secp256r1": SECP256R1, - "secp384r1": SECP384R1, - "secp521r1": SECP521R1, - - "sect163k1": SECT163K1, - "sect233k1": SECT233K1, - "sect283k1": SECT283K1, - "sect409k1": SECT409K1, - "sect571k1": SECT571K1, - - "sect163r2": SECT163R2, - "sect233r1": SECT233R1, - "sect283r1": SECT283R1, - "sect409r1": SECT409R1, - "sect571r1": SECT571R1, -} - - -@utils.register_interface(interfaces.EllipticCurveSignatureAlgorithm) -class ECDSA(object): - def __init__(self, algorithm): - self._algorithm = algorithm - - @property - def algorithm(self): - return self._algorithm - - -def generate_private_key(curve, backend): - return backend.generate_elliptic_curve_private_key(curve) - - -class EllipticCurvePublicNumbers(object): - def __init__(self, x, y, curve): - if ( - not isinstance(x, six.integer_types) or - not isinstance(y, six.integer_types) - ): - raise TypeError("x and y must be integers.") - - if not isinstance(curve, interfaces.EllipticCurve): - raise TypeError("curve must provide the EllipticCurve interface.") - - self._y = y - self._x = x - self._curve = curve - - def public_key(self, backend): - try: - return backend.load_elliptic_curve_public_numbers(self) - except AttributeError: - return backend.elliptic_curve_public_key_from_numbers(self) - - @property - def curve(self): - return self._curve - - @property - def x(self): - return self._x - - @property - def y(self): - return self._y - - -class EllipticCurvePrivateNumbers(object): - def __init__(self, private_value, public_numbers): - if not isinstance(private_value, six.integer_types): - raise TypeError("private_value must be an integer.") - - if not isinstance(public_numbers, EllipticCurvePublicNumbers): - raise TypeError( - "public_numbers must be an EllipticCurvePublicNumbers " - "instance." - ) - - self._private_value = private_value - self._public_numbers = public_numbers - - def private_key(self, backend): - try: - return backend.load_elliptic_curve_private_numbers(self) - except AttributeError: - return backend.elliptic_curve_private_key_from_numbers(self) - - @property - def private_value(self): - return self._private_value - - @property - def public_numbers(self): - return self._public_numbers diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/padding.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/padding.py deleted file mode 100644 index 3967e06..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/padding.py +++ /dev/null @@ -1,65 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import six - -from cryptography import utils -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.AsymmetricPadding) -class PKCS1v15(object): - name = "EMSA-PKCS1-v1_5" - - -@utils.register_interface(interfaces.AsymmetricPadding) -class PSS(object): - MAX_LENGTH = object() - name = "EMSA-PSS" - - def __init__(self, mgf, salt_length): - self._mgf = mgf - - if (not isinstance(salt_length, six.integer_types) and - salt_length is not self.MAX_LENGTH): - raise TypeError("salt_length must be an integer.") - - if salt_length is not self.MAX_LENGTH and salt_length < 0: - raise ValueError("salt_length must be zero or greater.") - - self._salt_length = salt_length - - -@utils.register_interface(interfaces.AsymmetricPadding) -class OAEP(object): - name = "EME-OAEP" - - def __init__(self, mgf, algorithm, label): - if not isinstance(algorithm, interfaces.HashAlgorithm): - raise TypeError("Expected instance of interfaces.HashAlgorithm.") - - self._mgf = mgf - self._algorithm = algorithm - self._label = label - - -class MGF1(object): - MAX_LENGTH = object() - - def __init__(self, algorithm): - if not isinstance(algorithm, interfaces.HashAlgorithm): - raise TypeError("Expected instance of interfaces.HashAlgorithm.") - - self._algorithm = algorithm diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py deleted file mode 100644 index 398b376..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py +++ /dev/null @@ -1,407 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import warnings - -import six - -from cryptography import utils -from cryptography.exceptions import UnsupportedAlgorithm, _Reasons -from cryptography.hazmat.backends.interfaces import RSABackend - - -def generate_private_key(public_exponent, key_size, backend): - if not isinstance(backend, RSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement RSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - _verify_rsa_parameters(public_exponent, key_size) - return backend.generate_rsa_private_key(public_exponent, key_size) - - -def _verify_rsa_parameters(public_exponent, key_size): - if public_exponent < 3: - raise ValueError("public_exponent must be >= 3.") - - if public_exponent & 1 == 0: - raise ValueError("public_exponent must be odd.") - - if key_size < 512: - raise ValueError("key_size must be at least 512-bits.") - - -def _check_private_key_components(p, q, private_exponent, dmp1, dmq1, iqmp, - public_exponent, modulus): - if modulus < 3: - raise ValueError("modulus must be >= 3.") - - if p >= modulus: - raise ValueError("p must be < modulus.") - - if q >= modulus: - raise ValueError("q must be < modulus.") - - if dmp1 >= modulus: - raise ValueError("dmp1 must be < modulus.") - - if dmq1 >= modulus: - raise ValueError("dmq1 must be < modulus.") - - if iqmp >= modulus: - raise ValueError("iqmp must be < modulus.") - - if private_exponent >= modulus: - raise ValueError("private_exponent must be < modulus.") - - if public_exponent < 3 or public_exponent >= modulus: - raise ValueError("public_exponent must be >= 3 and < modulus.") - - if public_exponent & 1 == 0: - raise ValueError("public_exponent must be odd.") - - if dmp1 & 1 == 0: - raise ValueError("dmp1 must be odd.") - - if dmq1 & 1 == 0: - raise ValueError("dmq1 must be odd.") - - if p * q != modulus: - raise ValueError("p*q must equal modulus.") - - -def _check_public_key_components(e, n): - if n < 3: - raise ValueError("n must be >= 3.") - - if e < 3 or e >= n: - raise ValueError("e must be >= 3 and < n.") - - if e & 1 == 0: - raise ValueError("e must be odd.") - - -class RSAPublicKey(object): - def __init__(self, public_exponent, modulus): - warnings.warn( - "The RSAPublicKey class is deprecated and will be removed in a " - "future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - if ( - not isinstance(public_exponent, six.integer_types) or - not isinstance(modulus, six.integer_types) - ): - raise TypeError("RSAPublicKey arguments must be integers.") - - _check_public_key_components(public_exponent, modulus) - - self._public_exponent = public_exponent - self._modulus = modulus - - def verifier(self, signature, padding, algorithm, backend): - if not isinstance(backend, RSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement RSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - return backend.create_rsa_verification_ctx(self, signature, padding, - algorithm) - - def encrypt(self, plaintext, padding, backend): - if not isinstance(backend, RSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement RSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - return backend.encrypt_rsa(self, plaintext, padding) - - @property - def key_size(self): - return utils.bit_length(self.modulus) - - @property - def public_exponent(self): - return self._public_exponent - - @property - def modulus(self): - return self._modulus - - @property - def e(self): - return self.public_exponent - - @property - def n(self): - return self.modulus - - -def _modinv(e, m): - """ - Modular Multiplicative Inverse. Returns x such that: (x*e) mod m == 1 - """ - x1, y1, x2, y2 = 1, 0, 0, 1 - a, b = e, m - while b > 0: - q, r = divmod(a, b) - xn, yn = x1 - q * x2, y1 - q * y2 - a, b, x1, y1, x2, y2 = b, r, x2, y2, xn, yn - return x1 % m - - -def rsa_crt_iqmp(p, q): - """ - Compute the CRT (q ** -1) % p value from RSA primes p and q. - """ - return _modinv(q, p) - - -def rsa_crt_dmp1(private_exponent, p): - """ - Compute the CRT private_exponent % (p - 1) value from the RSA - private_exponent and p. - """ - return private_exponent % (p - 1) - - -def rsa_crt_dmq1(private_exponent, q): - """ - Compute the CRT private_exponent % (q - 1) value from the RSA - private_exponent and q. - """ - return private_exponent % (q - 1) - - -class RSAPrivateKey(object): - def __init__(self, p, q, private_exponent, dmp1, dmq1, iqmp, - public_exponent, modulus): - warnings.warn( - "The RSAPrivateKey class is deprecated and will be removed in a " - "future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - if ( - not isinstance(p, six.integer_types) or - not isinstance(q, six.integer_types) or - not isinstance(dmp1, six.integer_types) or - not isinstance(dmq1, six.integer_types) or - not isinstance(iqmp, six.integer_types) or - not isinstance(private_exponent, six.integer_types) or - not isinstance(public_exponent, six.integer_types) or - not isinstance(modulus, six.integer_types) - ): - raise TypeError("RSAPrivateKey arguments must be integers.") - - _check_private_key_components(p, q, private_exponent, dmp1, dmq1, iqmp, - public_exponent, modulus) - - self._p = p - self._q = q - self._dmp1 = dmp1 - self._dmq1 = dmq1 - self._iqmp = iqmp - self._private_exponent = private_exponent - self._public_exponent = public_exponent - self._modulus = modulus - - @classmethod - def generate(cls, public_exponent, key_size, backend): - warnings.warn( - "generate is deprecated and will be removed in a future version.", - utils.DeprecatedIn05, - stacklevel=2 - ) - if not isinstance(backend, RSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement RSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - _verify_rsa_parameters(public_exponent, key_size) - key = backend.generate_rsa_private_key(public_exponent, key_size) - private_numbers = key.private_numbers() - return RSAPrivateKey( - p=private_numbers.p, - q=private_numbers.q, - dmp1=private_numbers.dmp1, - dmq1=private_numbers.dmq1, - iqmp=private_numbers.iqmp, - private_exponent=private_numbers.d, - public_exponent=private_numbers.public_numbers.e, - modulus=private_numbers.public_numbers.n - ) - - def signer(self, padding, algorithm, backend): - if not isinstance(backend, RSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement RSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - return backend.create_rsa_signature_ctx(self, padding, algorithm) - - def decrypt(self, ciphertext, padding, backend): - if not isinstance(backend, RSABackend): - raise UnsupportedAlgorithm( - "Backend object does not implement RSABackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - return backend.decrypt_rsa(self, ciphertext, padding) - - @property - def key_size(self): - return utils.bit_length(self.modulus) - - def public_key(self): - return RSAPublicKey(self.public_exponent, self.modulus) - - @property - def p(self): - return self._p - - @property - def q(self): - return self._q - - @property - def private_exponent(self): - return self._private_exponent - - @property - def public_exponent(self): - return self._public_exponent - - @property - def modulus(self): - return self._modulus - - @property - def d(self): - return self.private_exponent - - @property - def dmp1(self): - return self._dmp1 - - @property - def dmq1(self): - return self._dmq1 - - @property - def iqmp(self): - return self._iqmp - - @property - def e(self): - return self.public_exponent - - @property - def n(self): - return self.modulus - - -class RSAPrivateNumbers(object): - def __init__(self, p, q, d, dmp1, dmq1, iqmp, - public_numbers): - if ( - not isinstance(p, six.integer_types) or - not isinstance(q, six.integer_types) or - not isinstance(d, six.integer_types) or - not isinstance(dmp1, six.integer_types) or - not isinstance(dmq1, six.integer_types) or - not isinstance(iqmp, six.integer_types) - ): - raise TypeError( - "RSAPrivateNumbers p, q, d, dmp1, dmq1, iqmp arguments must" - " all be an integers." - ) - - if not isinstance(public_numbers, RSAPublicNumbers): - raise TypeError( - "RSAPrivateNumbers public_numbers must be an RSAPublicNumbers" - " instance." - ) - - self._p = p - self._q = q - self._d = d - self._dmp1 = dmp1 - self._dmq1 = dmq1 - self._iqmp = iqmp - self._public_numbers = public_numbers - - @property - def p(self): - return self._p - - @property - def q(self): - return self._q - - @property - def d(self): - return self._d - - @property - def dmp1(self): - return self._dmp1 - - @property - def dmq1(self): - return self._dmq1 - - @property - def iqmp(self): - return self._iqmp - - @property - def public_numbers(self): - return self._public_numbers - - def private_key(self, backend): - return backend.load_rsa_private_numbers(self) - - -class RSAPublicNumbers(object): - def __init__(self, e, n): - if ( - not isinstance(e, six.integer_types) or - not isinstance(n, six.integer_types) - ): - raise TypeError("RSAPublicNumbers arguments must be integers.") - - self._e = e - self._n = n - - @property - def e(self): - return self._e - - @property - def n(self): - return self._n - - def public_key(self, backend): - return backend.load_rsa_public_numbers(self) - - def __repr__(self): - return "".format(self._e, self._n) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py deleted file mode 100644 index e5a8ca5..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography.hazmat.primitives.ciphers.base import Cipher - - -__all__ = [ - "Cipher", -] diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py deleted file mode 100644 index bd8437c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py +++ /dev/null @@ -1,147 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.hazmat.primitives import interfaces - - -def _verify_key_size(algorithm, key): - # Verify that the key size matches the expected key size - if len(key) * 8 not in algorithm.key_sizes: - raise ValueError("Invalid key size ({0}) for {1}.".format( - len(key) * 8, algorithm.name - )) - return key - - -@utils.register_interface(interfaces.BlockCipherAlgorithm) -@utils.register_interface(interfaces.CipherAlgorithm) -class AES(object): - name = "AES" - block_size = 128 - key_sizes = frozenset([128, 192, 256]) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.BlockCipherAlgorithm) -@utils.register_interface(interfaces.CipherAlgorithm) -class Camellia(object): - name = "camellia" - block_size = 128 - key_sizes = frozenset([128, 192, 256]) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.BlockCipherAlgorithm) -@utils.register_interface(interfaces.CipherAlgorithm) -class TripleDES(object): - name = "3DES" - block_size = 64 - key_sizes = frozenset([64, 128, 192]) - - def __init__(self, key): - if len(key) == 8: - key += key + key - elif len(key) == 16: - key += key[:8] - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.BlockCipherAlgorithm) -@utils.register_interface(interfaces.CipherAlgorithm) -class Blowfish(object): - name = "Blowfish" - block_size = 64 - key_sizes = frozenset(range(32, 449, 8)) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.BlockCipherAlgorithm) -@utils.register_interface(interfaces.CipherAlgorithm) -class CAST5(object): - name = "CAST5" - block_size = 64 - key_sizes = frozenset(range(40, 129, 8)) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.CipherAlgorithm) -class ARC4(object): - name = "RC4" - key_sizes = frozenset([40, 56, 64, 80, 128, 192, 256]) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.CipherAlgorithm) -class IDEA(object): - name = "IDEA" - block_size = 64 - key_sizes = frozenset([128]) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 - - -@utils.register_interface(interfaces.BlockCipherAlgorithm) -@utils.register_interface(interfaces.CipherAlgorithm) -class SEED(object): - name = "SEED" - block_size = 128 - key_sizes = frozenset([128]) - - def __init__(self, key): - self.key = _verify_key_size(self, key) - - @property - def key_size(self): - return len(self.key) * 8 diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/base.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/base.py deleted file mode 100644 index e3fe5ad..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/base.py +++ /dev/null @@ -1,132 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, AlreadyUpdated, NotYetFinalized, UnsupportedAlgorithm, - _Reasons -) -from cryptography.hazmat.backends.interfaces import CipherBackend -from cryptography.hazmat.primitives import interfaces - - -class Cipher(object): - def __init__(self, algorithm, mode, backend): - if not isinstance(backend, CipherBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement CipherBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - if not isinstance(algorithm, interfaces.CipherAlgorithm): - raise TypeError( - "Expected interface of interfaces.CipherAlgorithm." - ) - - if mode is not None: - mode.validate_for_algorithm(algorithm) - - self.algorithm = algorithm - self.mode = mode - self._backend = backend - - def encryptor(self): - if isinstance(self.mode, interfaces.ModeWithAuthenticationTag): - if self.mode.tag is not None: - raise ValueError( - "Authentication tag must be None when encrypting." - ) - ctx = self._backend.create_symmetric_encryption_ctx( - self.algorithm, self.mode - ) - return self._wrap_ctx(ctx, encrypt=True) - - def decryptor(self): - if isinstance(self.mode, interfaces.ModeWithAuthenticationTag): - if self.mode.tag is None: - raise ValueError( - "Authentication tag must be provided when decrypting." - ) - ctx = self._backend.create_symmetric_decryption_ctx( - self.algorithm, self.mode - ) - return self._wrap_ctx(ctx, encrypt=False) - - def _wrap_ctx(self, ctx, encrypt): - if isinstance(self.mode, interfaces.ModeWithAuthenticationTag): - if encrypt: - return _AEADEncryptionContext(ctx) - else: - return _AEADCipherContext(ctx) - else: - return _CipherContext(ctx) - - -@utils.register_interface(interfaces.CipherContext) -class _CipherContext(object): - def __init__(self, ctx): - self._ctx = ctx - - def update(self, data): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - return self._ctx.update(data) - - def finalize(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - data = self._ctx.finalize() - self._ctx = None - return data - - -@utils.register_interface(interfaces.AEADCipherContext) -@utils.register_interface(interfaces.CipherContext) -class _AEADCipherContext(object): - def __init__(self, ctx): - self._ctx = ctx - self._tag = None - self._updated = False - - def update(self, data): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - self._updated = True - return self._ctx.update(data) - - def finalize(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - data = self._ctx.finalize() - self._tag = self._ctx.tag - self._ctx = None - return data - - def authenticate_additional_data(self, data): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - if self._updated: - raise AlreadyUpdated("Update has been called on this context.") - self._ctx.authenticate_additional_data(data) - - -@utils.register_interface(interfaces.AEADEncryptionContext) -class _AEADEncryptionContext(_AEADCipherContext): - @property - def tag(self): - if self._ctx is not None: - raise NotYetFinalized("You must finalize encryption before " - "getting the tag.") - return self._tag diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/modes.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/modes.py deleted file mode 100644 index 509b4de..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/ciphers/modes.py +++ /dev/null @@ -1,116 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.hazmat.primitives import interfaces - - -def _check_iv_length(mode, algorithm): - if len(mode.initialization_vector) * 8 != algorithm.block_size: - raise ValueError("Invalid IV size ({0}) for {1}.".format( - len(mode.initialization_vector), mode.name - )) - - -@utils.register_interface(interfaces.Mode) -@utils.register_interface(interfaces.ModeWithInitializationVector) -class CBC(object): - name = "CBC" - - def __init__(self, initialization_vector): - self.initialization_vector = initialization_vector - - validate_for_algorithm = _check_iv_length - - -@utils.register_interface(interfaces.Mode) -class ECB(object): - name = "ECB" - - def validate_for_algorithm(self, algorithm): - pass - - -@utils.register_interface(interfaces.Mode) -@utils.register_interface(interfaces.ModeWithInitializationVector) -class OFB(object): - name = "OFB" - - def __init__(self, initialization_vector): - self.initialization_vector = initialization_vector - - validate_for_algorithm = _check_iv_length - - -@utils.register_interface(interfaces.Mode) -@utils.register_interface(interfaces.ModeWithInitializationVector) -class CFB(object): - name = "CFB" - - def __init__(self, initialization_vector): - self.initialization_vector = initialization_vector - - validate_for_algorithm = _check_iv_length - - -@utils.register_interface(interfaces.Mode) -@utils.register_interface(interfaces.ModeWithInitializationVector) -class CFB8(object): - name = "CFB8" - - def __init__(self, initialization_vector): - self.initialization_vector = initialization_vector - - validate_for_algorithm = _check_iv_length - - -@utils.register_interface(interfaces.Mode) -@utils.register_interface(interfaces.ModeWithNonce) -class CTR(object): - name = "CTR" - - def __init__(self, nonce): - self.nonce = nonce - - def validate_for_algorithm(self, algorithm): - if len(self.nonce) * 8 != algorithm.block_size: - raise ValueError("Invalid nonce size ({0}) for {1}.".format( - len(self.nonce), self.name - )) - - -@utils.register_interface(interfaces.Mode) -@utils.register_interface(interfaces.ModeWithInitializationVector) -@utils.register_interface(interfaces.ModeWithAuthenticationTag) -class GCM(object): - name = "GCM" - - def __init__(self, initialization_vector, tag=None, min_tag_length=16): - # len(initialization_vector) must in [1, 2 ** 64), but it's impossible - # to actually construct a bytes object that large, so we don't check - # for it - if min_tag_length < 4: - raise ValueError("min_tag_length must be >= 4") - if tag is not None and len(tag) < min_tag_length: - raise ValueError( - "Authentication tag must be {0} bytes or longer.".format( - min_tag_length) - ) - - self.initialization_vector = initialization_vector - self.tag = tag - - def validate_for_algorithm(self, algorithm): - pass diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/cmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/cmac.py deleted file mode 100644 index fa463ae..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/cmac.py +++ /dev/null @@ -1,73 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, InvalidSignature, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import CMACBackend -from cryptography.hazmat.primitives import constant_time, interfaces - - -@utils.register_interface(interfaces.CMACContext) -class CMAC(object): - def __init__(self, algorithm, backend, ctx=None): - if not isinstance(backend, CMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement CMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - if not isinstance(algorithm, interfaces.BlockCipherAlgorithm): - raise TypeError( - "Expected instance of interfaces.BlockCipherAlgorithm." - ) - self._algorithm = algorithm - - self._backend = backend - if ctx is None: - self._ctx = self._backend.create_cmac_ctx(self._algorithm) - else: - self._ctx = ctx - - def update(self, data): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - if not isinstance(data, bytes): - raise TypeError("data must be bytes.") - self._ctx.update(data) - - def finalize(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - digest = self._ctx.finalize() - self._ctx = None - return digest - - def verify(self, signature): - if not isinstance(signature, bytes): - raise TypeError("signature must be bytes.") - digest = self.finalize() - if not constant_time.bytes_eq(digest, signature): - raise InvalidSignature("Signature did not match digest.") - - def copy(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - return CMAC( - self._algorithm, - backend=self._backend, - ctx=self._ctx.copy() - ) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/constant_time.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/constant_time.py deleted file mode 100644 index d75528a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/constant_time.py +++ /dev/null @@ -1,54 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import hmac -import os -import sys - -import cffi - -from cryptography.hazmat.bindings.utils import _create_modulename - - -with open(os.path.join(os.path.dirname(__file__), "src/constant_time.h")) as f: - TYPES = f.read() - -with open(os.path.join(os.path.dirname(__file__), "src/constant_time.c")) as f: - FUNCTIONS = f.read() - - -_ffi = cffi.FFI() -_ffi.cdef(TYPES) -_lib = _ffi.verify( - source=FUNCTIONS, - modulename=_create_modulename([TYPES], FUNCTIONS, sys.version), - ext_package="cryptography", -) - -if hasattr(hmac, "compare_digest"): - def bytes_eq(a, b): - if not isinstance(a, bytes) or not isinstance(b, bytes): - raise TypeError("a and b must be bytes.") - - return hmac.compare_digest(a, b) - -else: - def bytes_eq(a, b): - if not isinstance(a, bytes) or not isinstance(b, bytes): - raise TypeError("a and b must be bytes.") - - return _lib.Cryptography_constant_time_bytes_eq( - a, len(a), b, len(b) - ) == 1 diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hashes.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hashes.py deleted file mode 100644 index 04f7620..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hashes.py +++ /dev/null @@ -1,119 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import HashBackend -from cryptography.hazmat.primitives import interfaces - - -@utils.register_interface(interfaces.HashContext) -class Hash(object): - def __init__(self, algorithm, backend, ctx=None): - if not isinstance(backend, HashBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement HashBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - if not isinstance(algorithm, interfaces.HashAlgorithm): - raise TypeError("Expected instance of interfaces.HashAlgorithm.") - self.algorithm = algorithm - - self._backend = backend - - if ctx is None: - self._ctx = self._backend.create_hash_ctx(self.algorithm) - else: - self._ctx = ctx - - def update(self, data): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - if not isinstance(data, bytes): - raise TypeError("data must be bytes.") - self._ctx.update(data) - - def copy(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - return Hash( - self.algorithm, backend=self._backend, ctx=self._ctx.copy() - ) - - def finalize(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - digest = self._ctx.finalize() - self._ctx = None - return digest - - -@utils.register_interface(interfaces.HashAlgorithm) -class SHA1(object): - name = "sha1" - digest_size = 20 - block_size = 64 - - -@utils.register_interface(interfaces.HashAlgorithm) -class SHA224(object): - name = "sha224" - digest_size = 28 - block_size = 64 - - -@utils.register_interface(interfaces.HashAlgorithm) -class SHA256(object): - name = "sha256" - digest_size = 32 - block_size = 64 - - -@utils.register_interface(interfaces.HashAlgorithm) -class SHA384(object): - name = "sha384" - digest_size = 48 - block_size = 128 - - -@utils.register_interface(interfaces.HashAlgorithm) -class SHA512(object): - name = "sha512" - digest_size = 64 - block_size = 128 - - -@utils.register_interface(interfaces.HashAlgorithm) -class RIPEMD160(object): - name = "ripemd160" - digest_size = 20 - block_size = 64 - - -@utils.register_interface(interfaces.HashAlgorithm) -class Whirlpool(object): - name = "whirlpool" - digest_size = 64 - block_size = 64 - - -@utils.register_interface(interfaces.HashAlgorithm) -class MD5(object): - name = "md5" - digest_size = 16 - block_size = 64 diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hmac.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hmac.py deleted file mode 100644 index 026ad3b..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/hmac.py +++ /dev/null @@ -1,73 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, InvalidSignature, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import HMACBackend -from cryptography.hazmat.primitives import constant_time, interfaces - - -@utils.register_interface(interfaces.HashContext) -class HMAC(object): - def __init__(self, key, algorithm, backend, ctx=None): - if not isinstance(backend, HMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement HMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - if not isinstance(algorithm, interfaces.HashAlgorithm): - raise TypeError("Expected instance of interfaces.HashAlgorithm.") - self.algorithm = algorithm - - self._backend = backend - self._key = key - if ctx is None: - self._ctx = self._backend.create_hmac_ctx(key, self.algorithm) - else: - self._ctx = ctx - - def update(self, msg): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - if not isinstance(msg, bytes): - raise TypeError("msg must be bytes.") - self._ctx.update(msg) - - def copy(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - return HMAC( - self._key, - self.algorithm, - backend=self._backend, - ctx=self._ctx.copy() - ) - - def finalize(self): - if self._ctx is None: - raise AlreadyFinalized("Context was already finalized.") - digest = self._ctx.finalize() - self._ctx = None - return digest - - def verify(self, signature): - if not isinstance(signature, bytes): - raise TypeError("signature must be bytes.") - digest = self.finalize() - if not constant_time.bytes_eq(digest, signature): - raise InvalidSignature("Signature did not match digest.") diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/interfaces.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/interfaces.py deleted file mode 100644 index c7ad0cf..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/interfaces.py +++ /dev/null @@ -1,476 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import abc - -import six - - -@six.add_metaclass(abc.ABCMeta) -class CipherAlgorithm(object): - @abc.abstractproperty - def name(self): - """ - A string naming this mode (e.g. "AES", "Camellia"). - """ - - @abc.abstractproperty - def key_size(self): - """ - The size of the key being used as an integer in bits (e.g. 128, 256). - """ - - -@six.add_metaclass(abc.ABCMeta) -class BlockCipherAlgorithm(object): - @abc.abstractproperty - def block_size(self): - """ - The size of a block as an integer in bits (e.g. 64, 128). - """ - - -@six.add_metaclass(abc.ABCMeta) -class Mode(object): - @abc.abstractproperty - def name(self): - """ - A string naming this mode (e.g. "ECB", "CBC"). - """ - - @abc.abstractmethod - def validate_for_algorithm(self, algorithm): - """ - Checks that all the necessary invariants of this (mode, algorithm) - combination are met. - """ - - -@six.add_metaclass(abc.ABCMeta) -class ModeWithInitializationVector(object): - @abc.abstractproperty - def initialization_vector(self): - """ - The value of the initialization vector for this mode as bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class ModeWithNonce(object): - @abc.abstractproperty - def nonce(self): - """ - The value of the nonce for this mode as bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class ModeWithAuthenticationTag(object): - @abc.abstractproperty - def tag(self): - """ - The value of the tag supplied to the constructor of this mode. - """ - - -@six.add_metaclass(abc.ABCMeta) -class CipherContext(object): - @abc.abstractmethod - def update(self, data): - """ - Processes the provided bytes through the cipher and returns the results - as bytes. - """ - - @abc.abstractmethod - def finalize(self): - """ - Returns the results of processing the final block as bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class AEADCipherContext(object): - @abc.abstractmethod - def authenticate_additional_data(self, data): - """ - Authenticates the provided bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class AEADEncryptionContext(object): - @abc.abstractproperty - def tag(self): - """ - Returns tag bytes. This is only available after encryption is - finalized. - """ - - -@six.add_metaclass(abc.ABCMeta) -class PaddingContext(object): - @abc.abstractmethod - def update(self, data): - """ - Pads the provided bytes and returns any available data as bytes. - """ - - @abc.abstractmethod - def finalize(self): - """ - Finalize the padding, returns bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class HashAlgorithm(object): - @abc.abstractproperty - def name(self): - """ - A string naming this algorithm (e.g. "sha256", "md5"). - """ - - @abc.abstractproperty - def digest_size(self): - """ - The size of the resulting digest in bytes. - """ - - @abc.abstractproperty - def block_size(self): - """ - The internal block size of the hash algorithm in bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class HashContext(object): - @abc.abstractproperty - def algorithm(self): - """ - A HashAlgorithm that will be used by this context. - """ - - @abc.abstractmethod - def update(self, data): - """ - Processes the provided bytes through the hash. - """ - - @abc.abstractmethod - def finalize(self): - """ - Finalizes the hash context and returns the hash digest as bytes. - """ - - @abc.abstractmethod - def copy(self): - """ - Return a HashContext that is a copy of the current context. - """ - - -@six.add_metaclass(abc.ABCMeta) -class RSAPrivateKey(object): - @abc.abstractmethod - def signer(self, padding, algorithm): - """ - Returns an AsymmetricSignatureContext used for signing data. - """ - - @abc.abstractmethod - def decrypt(self, ciphertext, padding): - """ - Decrypts the provided ciphertext. - """ - - @abc.abstractproperty - def key_size(self): - """ - The bit length of the public modulus. - """ - - @abc.abstractmethod - def public_key(self): - """ - The RSAPublicKey associated with this private key. - """ - - -@six.add_metaclass(abc.ABCMeta) -class RSAPrivateKeyWithNumbers(RSAPrivateKey): - @abc.abstractmethod - def private_numbers(self): - """ - Returns an RSAPrivateNumbers. - """ - - -@six.add_metaclass(abc.ABCMeta) -class RSAPublicKey(object): - @abc.abstractmethod - def verifier(self, signature, padding, algorithm): - """ - Returns an AsymmetricVerificationContext used for verifying signatures. - """ - - @abc.abstractmethod - def encrypt(self, plaintext, padding): - """ - Encrypts the given plaintext. - """ - - @abc.abstractproperty - def key_size(self): - """ - The bit length of the public modulus. - """ - - -@six.add_metaclass(abc.ABCMeta) -class RSAPublicKeyWithNumbers(RSAPublicKey): - @abc.abstractmethod - def public_numbers(self): - """ - Returns an RSAPublicNumbers - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSAParameters(object): - @abc.abstractmethod - def generate_private_key(self): - """ - Generates and returns a DSAPrivateKey. - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSAParametersWithNumbers(DSAParameters): - @abc.abstractmethod - def parameter_numbers(self): - """ - Returns a DSAParameterNumbers. - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSAPrivateKey(object): - @abc.abstractproperty - def key_size(self): - """ - The bit length of the prime modulus. - """ - - @abc.abstractmethod - def public_key(self): - """ - The DSAPublicKey associated with this private key. - """ - - @abc.abstractmethod - def parameters(self): - """ - The DSAParameters object associated with this private key. - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSAPrivateKeyWithNumbers(DSAPrivateKey): - @abc.abstractmethod - def private_numbers(self): - """ - Returns a DSAPrivateNumbers. - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSAPublicKey(object): - @abc.abstractproperty - def key_size(self): - """ - The bit length of the prime modulus. - """ - - @abc.abstractmethod - def parameters(self): - """ - The DSAParameters object associated with this public key. - """ - - -@six.add_metaclass(abc.ABCMeta) -class DSAPublicKeyWithNumbers(DSAPublicKey): - @abc.abstractmethod - def public_numbers(self): - """ - Returns a DSAPublicNumbers. - """ - - -@six.add_metaclass(abc.ABCMeta) -class AsymmetricSignatureContext(object): - @abc.abstractmethod - def update(self, data): - """ - Processes the provided bytes and returns nothing. - """ - - @abc.abstractmethod - def finalize(self): - """ - Returns the signature as bytes. - """ - - -@six.add_metaclass(abc.ABCMeta) -class AsymmetricVerificationContext(object): - @abc.abstractmethod - def update(self, data): - """ - Processes the provided bytes and returns nothing. - """ - - @abc.abstractmethod - def verify(self): - """ - Raises an exception if the bytes provided to update do not match the - signature or the signature does not match the public key. - """ - - -@six.add_metaclass(abc.ABCMeta) -class AsymmetricPadding(object): - @abc.abstractproperty - def name(self): - """ - A string naming this padding (e.g. "PSS", "PKCS1"). - """ - - -@six.add_metaclass(abc.ABCMeta) -class KeyDerivationFunction(object): - @abc.abstractmethod - def derive(self, key_material): - """ - Deterministically generates and returns a new key based on the existing - key material. - """ - - @abc.abstractmethod - def verify(self, key_material, expected_key): - """ - Checks whether the key generated by the key material matches the - expected derived key. Raises an exception if they do not match. - """ - - -@six.add_metaclass(abc.ABCMeta) -class CMACContext(object): - @abc.abstractmethod - def update(self, data): - """ - Processes the provided bytes. - """ - - def finalize(self): - """ - Returns the message authentication code as bytes. - """ - - @abc.abstractmethod - def copy(self): - """ - Return a CMACContext that is a copy of the current context. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurve(object): - @abc.abstractproperty - def name(self): - """ - The name of the curve. e.g. secp256r1. - """ - - @abc.abstractproperty - def key_size(self): - """ - The bit length of the base point of the curve. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurveSignatureAlgorithm(object): - @abc.abstractproperty - def algorithm(self): - """ - The digest algorithm used with this signature. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurvePrivateKey(object): - @abc.abstractmethod - def signer(self, signature_algorithm): - """ - Returns an AsymmetricSignatureContext used for signing data. - """ - - @abc.abstractmethod - def public_key(self): - """ - The EllipticCurvePublicKey for this private key. - """ - - @abc.abstractproperty - def curve(self): - """ - The EllipticCurve that this key is on. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurvePrivateKeyWithNumbers(EllipticCurvePrivateKey): - @abc.abstractmethod - def private_numbers(self): - """ - Returns an EllipticCurvePrivateNumbers. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurvePublicKey(object): - @abc.abstractmethod - def verifier(self, signature, signature_algorithm): - """ - Returns an AsymmetricVerificationContext used for signing data. - """ - - @abc.abstractproperty - def curve(self): - """ - The EllipticCurve that this key is on. - """ - - -@six.add_metaclass(abc.ABCMeta) -class EllipticCurvePublicKeyWithNumbers(EllipticCurvePublicKey): - @abc.abstractmethod - def public_numbers(self): - """ - Returns an EllipticCurvePublicNumbers. - """ diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py deleted file mode 100644 index 04d02b2..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py +++ /dev/null @@ -1,124 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import six - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import HMACBackend -from cryptography.hazmat.primitives import constant_time, hmac, interfaces - - -@utils.register_interface(interfaces.KeyDerivationFunction) -class HKDF(object): - def __init__(self, algorithm, length, salt, info, backend): - if not isinstance(backend, HMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement HMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - self._algorithm = algorithm - - if not isinstance(salt, bytes) and salt is not None: - raise TypeError("salt must be bytes.") - - if salt is None: - salt = b"\x00" * (self._algorithm.digest_size // 8) - - self._salt = salt - - self._backend = backend - - self._hkdf_expand = HKDFExpand(self._algorithm, length, info, backend) - - def _extract(self, key_material): - h = hmac.HMAC(self._salt, self._algorithm, backend=self._backend) - h.update(key_material) - return h.finalize() - - def derive(self, key_material): - if not isinstance(key_material, bytes): - raise TypeError("key_material must be bytes.") - - return self._hkdf_expand.derive(self._extract(key_material)) - - def verify(self, key_material, expected_key): - if not constant_time.bytes_eq(self.derive(key_material), expected_key): - raise InvalidKey - - -@utils.register_interface(interfaces.KeyDerivationFunction) -class HKDFExpand(object): - def __init__(self, algorithm, length, info, backend): - if not isinstance(backend, HMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement HMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - self._algorithm = algorithm - - self._backend = backend - - max_length = 255 * (algorithm.digest_size // 8) - - if length > max_length: - raise ValueError( - "Can not derive keys larger than {0} octets.".format( - max_length - )) - - self._length = length - - if not isinstance(info, bytes) and info is not None: - raise TypeError("info must be bytes.") - - if info is None: - info = b"" - - self._info = info - - self._used = False - - def _expand(self, key_material): - output = [b""] - counter = 1 - - while (self._algorithm.digest_size // 8) * len(output) < self._length: - h = hmac.HMAC(key_material, self._algorithm, backend=self._backend) - h.update(output[-1]) - h.update(self._info) - h.update(six.int2byte(counter)) - output.append(h.finalize()) - counter += 1 - - return b"".join(output)[:self._length] - - def derive(self, key_material): - if not isinstance(key_material, bytes): - raise TypeError("key_material must be bytes.") - - if self._used: - raise AlreadyFinalized - - self._used = True - return self._expand(key_material) - - def verify(self, key_material, expected_key): - if not constant_time.bytes_eq(self.derive(key_material), expected_key): - raise InvalidKey diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py deleted file mode 100644 index 97b6408..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py +++ /dev/null @@ -1,66 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography import utils -from cryptography.exceptions import ( - AlreadyFinalized, InvalidKey, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import PBKDF2HMACBackend -from cryptography.hazmat.primitives import constant_time, interfaces - - -@utils.register_interface(interfaces.KeyDerivationFunction) -class PBKDF2HMAC(object): - def __init__(self, algorithm, length, salt, iterations, backend): - if not isinstance(backend, PBKDF2HMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement PBKDF2HMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - if not backend.pbkdf2_hmac_supported(algorithm): - raise UnsupportedAlgorithm( - "{0} is not supported for PBKDF2 by this backend.".format( - algorithm.name), - _Reasons.UNSUPPORTED_HASH - ) - self._used = False - self._algorithm = algorithm - self._length = length - if not isinstance(salt, bytes): - raise TypeError("salt must be bytes.") - self._salt = salt - self._iterations = iterations - self._backend = backend - - def derive(self, key_material): - if self._used: - raise AlreadyFinalized("PBKDF2 instances can only be used once.") - self._used = True - - if not isinstance(key_material, bytes): - raise TypeError("key_material must be bytes.") - return self._backend.derive_pbkdf2_hmac( - self._algorithm, - self._length, - self._salt, - self._iterations, - key_material - ) - - def verify(self, key_material, expected_key): - derived_key = self.derive(key_material) - if not constant_time.bytes_eq(derived_key, expected_key): - raise InvalidKey("Keys do not match.") diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/padding.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/padding.py deleted file mode 100644 index 74f1ef2..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/padding.py +++ /dev/null @@ -1,172 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import sys - -import cffi - -import six - -from cryptography import utils -from cryptography.exceptions import AlreadyFinalized -from cryptography.hazmat.bindings.utils import _create_modulename -from cryptography.hazmat.primitives import interfaces - - -TYPES = """ -uint8_t Cryptography_check_pkcs7_padding(const uint8_t *, uint8_t); -""" - -FUNCTIONS = """ -/* Returns the value of the input with the most-significant-bit copied to all - of the bits. */ -static uint8_t Cryptography_DUPLICATE_MSB_TO_ALL(uint8_t a) { - return (1 - (a >> (sizeof(uint8_t) * 8 - 1))) - 1; -} - -/* This returns 0xFF if a < b else 0x00, but does so in a constant time - fashion */ -static uint8_t Cryptography_constant_time_lt(uint8_t a, uint8_t b) { - a -= b; - return Cryptography_DUPLICATE_MSB_TO_ALL(a); -} - -uint8_t Cryptography_check_pkcs7_padding(const uint8_t *data, - uint8_t block_len) { - uint8_t i; - uint8_t pad_size = data[block_len - 1]; - uint8_t mismatch = 0; - for (i = 0; i < block_len; i++) { - unsigned int mask = Cryptography_constant_time_lt(i, pad_size); - uint8_t b = data[block_len - 1 - i]; - mismatch |= (mask & (pad_size ^ b)); - } - - /* Check to make sure the pad_size was within the valid range. */ - mismatch |= ~Cryptography_constant_time_lt(0, pad_size); - mismatch |= Cryptography_constant_time_lt(block_len, pad_size); - - /* Make sure any bits set are copied to the lowest bit */ - mismatch |= mismatch >> 4; - mismatch |= mismatch >> 2; - mismatch |= mismatch >> 1; - /* Now check the low bit to see if it's set */ - return (mismatch & 1) == 0; -} -""" - -_ffi = cffi.FFI() -_ffi.cdef(TYPES) -_lib = _ffi.verify( - source=FUNCTIONS, - modulename=_create_modulename([TYPES], FUNCTIONS, sys.version), - ext_package="cryptography", -) - - -class PKCS7(object): - def __init__(self, block_size): - if not (0 <= block_size < 256): - raise ValueError("block_size must be in range(0, 256).") - - if block_size % 8 != 0: - raise ValueError("block_size must be a multiple of 8.") - - self.block_size = block_size - - def padder(self): - return _PKCS7PaddingContext(self.block_size) - - def unpadder(self): - return _PKCS7UnpaddingContext(self.block_size) - - -@utils.register_interface(interfaces.PaddingContext) -class _PKCS7PaddingContext(object): - def __init__(self, block_size): - self.block_size = block_size - # TODO: more copies than necessary, we should use zero-buffer (#193) - self._buffer = b"" - - def update(self, data): - if self._buffer is None: - raise AlreadyFinalized("Context was already finalized.") - - if not isinstance(data, bytes): - raise TypeError("data must be bytes.") - - self._buffer += data - - finished_blocks = len(self._buffer) // (self.block_size // 8) - - result = self._buffer[:finished_blocks * (self.block_size // 8)] - self._buffer = self._buffer[finished_blocks * (self.block_size // 8):] - - return result - - def finalize(self): - if self._buffer is None: - raise AlreadyFinalized("Context was already finalized.") - - pad_size = self.block_size // 8 - len(self._buffer) - result = self._buffer + six.int2byte(pad_size) * pad_size - self._buffer = None - return result - - -@utils.register_interface(interfaces.PaddingContext) -class _PKCS7UnpaddingContext(object): - def __init__(self, block_size): - self.block_size = block_size - # TODO: more copies than necessary, we should use zero-buffer (#193) - self._buffer = b"" - - def update(self, data): - if self._buffer is None: - raise AlreadyFinalized("Context was already finalized.") - - if not isinstance(data, bytes): - raise TypeError("data must be bytes.") - - self._buffer += data - - finished_blocks = max( - len(self._buffer) // (self.block_size // 8) - 1, - 0 - ) - - result = self._buffer[:finished_blocks * (self.block_size // 8)] - self._buffer = self._buffer[finished_blocks * (self.block_size // 8):] - - return result - - def finalize(self): - if self._buffer is None: - raise AlreadyFinalized("Context was already finalized.") - - if len(self._buffer) != self.block_size // 8: - raise ValueError("Invalid padding bytes.") - - valid = _lib.Cryptography_check_pkcs7_padding( - self._buffer, self.block_size // 8 - ) - - if not valid: - raise ValueError("Invalid padding bytes.") - - pad_size = six.indexbytes(self._buffer, -1) - res = self._buffer[:-pad_size] - self._buffer = None - return res diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/serialization.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/serialization.py deleted file mode 100644 index 0fb560e..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/serialization.py +++ /dev/null @@ -1,50 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import warnings - -from cryptography import utils - - -def load_pem_traditional_openssl_private_key(data, password, backend): - warnings.warn( - "load_pem_traditional_openssl_private_key is deprecated and will be " - "removed in a future version, use load_pem_private_key instead.", - utils.DeprecatedIn06, - stacklevel=2 - ) - - return backend.load_traditional_openssl_pem_private_key( - data, password - ) - - -def load_pem_pkcs8_private_key(data, password, backend): - warnings.warn( - "load_pem_pkcs8_private_key is deprecated and will be removed in a " - "future version, use load_pem_private_key instead.", - utils.DeprecatedIn06, - stacklevel=2 - ) - - return backend.load_pkcs8_pem_private_key(data, password) - - -def load_pem_private_key(data, password, backend): - return backend.load_pem_private_key(data, password) - - -def load_pem_public_key(data, backend): - return backend.load_pem_public_key(data) diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.c b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.c deleted file mode 100644 index 13ac4ab..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.c +++ /dev/null @@ -1,31 +0,0 @@ -// 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. - -uint8_t Cryptography_constant_time_bytes_eq(uint8_t *a, size_t len_a, - uint8_t *b, size_t len_b) { - size_t i = 0; - uint8_t mismatch = 0; - if (len_a != len_b) { - return 0; - } - for (i = 0; i < len_a; i++) { - mismatch |= a[i] ^ b[i]; - } - - /* Make sure any bits set are copied to the lowest bit */ - mismatch |= mismatch >> 4; - mismatch |= mismatch >> 2; - mismatch |= mismatch >> 1; - /* Now check the low bit to see if it's set */ - return (mismatch & 1) == 0; -} diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.h b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.h deleted file mode 100644 index 4f41034..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/src/constant_time.h +++ /dev/null @@ -1,16 +0,0 @@ -// 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. - - -uint8_t Cryptography_constant_time_bytes_eq(uint8_t *, size_t, uint8_t *, - size_t); diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/__init__.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/__init__.py deleted file mode 100644 index 2f42057..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py deleted file mode 100644 index d0b476a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py +++ /dev/null @@ -1,69 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import struct - -import six - -from cryptography.exceptions import ( - InvalidToken, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import HMACBackend -from cryptography.hazmat.primitives import constant_time, hmac -from cryptography.hazmat.primitives.hashes import SHA1, SHA256, SHA512 - - -class HOTP(object): - def __init__(self, key, length, algorithm, backend): - if not isinstance(backend, HMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement HMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - if len(key) < 16: - raise ValueError("Key length has to be at least 128 bits.") - - if not isinstance(length, six.integer_types): - raise TypeError("Length parameter must be an integer type.") - - if length < 6 or length > 8: - raise ValueError("Length of HOTP has to be between 6 to 8.") - - if not isinstance(algorithm, (SHA1, SHA256, SHA512)): - raise TypeError("Algorithm must be SHA1, SHA256 or SHA512.") - - self._key = key - self._length = length - self._algorithm = algorithm - self._backend = backend - - def generate(self, counter): - truncated_value = self._dynamic_truncate(counter) - hotp = truncated_value % (10 ** self._length) - return "{0:0{1}}".format(hotp, self._length).encode() - - def verify(self, hotp, counter): - if not constant_time.bytes_eq(self.generate(counter), hotp): - raise InvalidToken("Supplied HOTP value does not match.") - - def _dynamic_truncate(self, counter): - ctx = hmac.HMAC(self._key, self._algorithm, self._backend) - ctx.update(struct.pack(">Q", counter)) - hmac_value = ctx.finalize() - - offset = six.indexbytes(hmac_value, len(hmac_value) - 1) & 0b1111 - p = hmac_value[offset:offset + 4] - return struct.unpack(">I", p)[0] & 0x7fffffff diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/totp.py b/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/totp.py deleted file mode 100644 index 854c516..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/hazmat/primitives/twofactor/totp.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -from cryptography.exceptions import ( - InvalidToken, UnsupportedAlgorithm, _Reasons -) -from cryptography.hazmat.backends.interfaces import HMACBackend -from cryptography.hazmat.primitives import constant_time -from cryptography.hazmat.primitives.twofactor.hotp import HOTP - - -class TOTP(object): - def __init__(self, key, length, algorithm, time_step, backend): - if not isinstance(backend, HMACBackend): - raise UnsupportedAlgorithm( - "Backend object does not implement HMACBackend.", - _Reasons.BACKEND_MISSING_INTERFACE - ) - - self._time_step = time_step - self._hotp = HOTP(key, length, algorithm, backend) - - def generate(self, time): - counter = int(time / self._time_step) - return self._hotp.generate(counter) - - def verify(self, totp, time): - if not constant_time.bytes_eq(self.generate(time), totp): - raise InvalidToken("Supplied TOTP value does not match.") diff --git a/Linux_i686/lib/python3.4/site-packages/cryptography/utils.py b/Linux_i686/lib/python3.4/site-packages/cryptography/utils.py deleted file mode 100644 index f4c2e3c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/cryptography/utils.py +++ /dev/null @@ -1,34 +0,0 @@ -# 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. - -from __future__ import absolute_import, division, print_function - -import sys - - -DeprecatedIn05 = DeprecationWarning -DeprecatedIn06 = PendingDeprecationWarning - - -def register_interface(iface): - def register_decorator(klass): - iface.register(klass) - return klass - return register_decorator - - -def bit_length(x): - if sys.version_info >= (2, 7): - return x.bit_length() - else: - return len(bin(x)) - (2 + (x <= 0)) diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/PKG-INFO b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/PKG-INFO similarity index 98% rename from Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/PKG-INFO rename to Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/PKG-INFO index 5d6abf0..654981e 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/PKG-INFO +++ b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: ed25519 -Version: 1.3 +Version: 1.4 Summary: Ed25519 public-key signatures Home-page: https://github.com/warner/python-ed25519 Author: Brian Warner diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/SOURCES.txt b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/SOURCES.txt similarity index 95% rename from Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/SOURCES.txt rename to Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/SOURCES.txt index 46a81ef..ebe0028 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/SOURCES.txt +++ b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/SOURCES.txt @@ -5,6 +5,7 @@ NEWS README.md kat-ed25519.txt kat.py +setup.cfg test_ed25519_kat.py versioneer.py bin/edsig diff --git a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/dependency_links.txt similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/dependency_links.txt rename to Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/dependency_links.txt diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/installed-files.txt similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/installed-files.txt rename to Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/installed-files.txt index 8a39faa..4cba6fe 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/installed-files.txt +++ b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/installed-files.txt @@ -1,15 +1,15 @@ -../ed25519/test_ed25519.py ../ed25519/keys.py -../ed25519/__init__.py ../ed25519/_version.py -../ed25519/__pycache__/test_ed25519.cpython-34.pyc +../ed25519/test_ed25519.py +../ed25519/__init__.py ../ed25519/__pycache__/keys.cpython-34.pyc -../ed25519/__pycache__/__init__.cpython-34.pyc ../ed25519/__pycache__/_version.cpython-34.pyc +../ed25519/__pycache__/test_ed25519.cpython-34.pyc +../ed25519/__pycache__/__init__.cpython-34.pyc ../ed25519/_ed25519.cpython-34m.so ./ +SOURCES.txt dependency_links.txt PKG-INFO -SOURCES.txt top_level.txt ../../../../bin/edsig diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/top_level.txt similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/ed25519-1.3.egg-info/top_level.txt rename to Linux_i686/lib/python3.4/site-packages/ed25519-1.4.egg-info/top_level.txt diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519/__init__.py b/Linux_i686/lib/python3.4/site-packages/ed25519/__init__.py index 565093c..7ad9cd8 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519/__init__.py +++ b/Linux_i686/lib/python3.4/site-packages/ed25519/__init__.py @@ -7,5 +7,5 @@ from .keys import (BadSignatureError, BadPrefixError, remove_prefix, to_ascii, from_ascii) # hush pyflakes from ._version import get_versions -__version__ = get_versions()['version'] +__version__ = str(get_versions()['version']) del get_versions diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519/_ed25519.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/ed25519/_ed25519.cpython-34m.so index 7000c844aef9f208c23a5dd60234e7904e01f7d2..9376b215dc581ca947e7b23758315bf783d33027 100755 GIT binary patch literal 261609 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

~l_6nFGCufOAP#!(u8Q)x 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 CyB2u> literal 267992 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 Y(m5W(LBs;97^kynkn@OjwqWx6e+g1RumAu6 diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519/_version.py b/Linux_i686/lib/python3.4/site-packages/ed25519/_version.py index f98ff6c..7c19428 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519/_version.py +++ b/Linux_i686/lib/python3.4/site-packages/ed25519/_version.py @@ -1,11 +1,21 @@ -# This file was generated by 'versioneer.py' (0.11) from +# This file was generated by 'versioneer.py' (0.15) from # revision-control system data, or from the parent directory name of an # unpacked source archive. Distribution tarballs contain a pre-generated copy # of this file. -version_version = '1.3' -version_full = '06c43e2d15ba45dbcfda780a81e9b49c199bce16' -def get_versions(default={}, verbose=False): - return {'version': version_version, 'full': version_full} +import json +import sys +version_json = ''' +{ + "dirty": false, + "error": null, + "full-revisionid": "a8732e8b6ba4e04e83c7ef05f86c565a2b2fc278", + "version": "1.4" +} +''' # END VERSION_JSON + + +def get_versions(): + return json.loads(version_json) diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519/keys.py b/Linux_i686/lib/python3.4/site-packages/ed25519/keys.py index 8bd8e2d..2803174 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519/keys.py +++ b/Linux_i686/lib/python3.4/site-packages/ed25519/keys.py @@ -60,13 +60,13 @@ def from_ascii(s_ascii, prefix="", encoding="base64"): prefix = prefix.decode('ascii') s_ascii = remove_prefix(s_ascii.strip(), prefix) if encoding == "base64": - s_ascii += "="*((4 - len(s_ascii)%4)%4) - s_bytes = base64.b64decode(s_ascii) + s_ascii += "=" * ((4 - len(s_ascii) % 4) % 4) + s_bytes = base64.b64decode(s_ascii.encode('ascii')) elif encoding == "base32": - s_ascii += "="*((8 - len(s_ascii)%8)%8) - s_bytes = base64.b32decode(s_ascii.upper()) + s_ascii += "=" * ((8 - len(s_ascii) % 8) % 8) + s_bytes = base64.b32decode(s_ascii.upper().encode('ascii')) elif encoding in ("base16", "hex"): - s_bytes = base64.b16decode(s_ascii.upper()) + s_bytes = base64.b16decode(s_ascii.upper().encode('ascii')) else: raise NotImplementedError return s_bytes diff --git a/Linux_i686/lib/python3.4/site-packages/ed25519/test_ed25519.py b/Linux_i686/lib/python3.4/site-packages/ed25519/test_ed25519.py index c5830c9..8dea618 100644 --- a/Linux_i686/lib/python3.4/site-packages/ed25519/test_ed25519.py +++ b/Linux_i686/lib/python3.4/site-packages/ed25519/test_ed25519.py @@ -54,8 +54,8 @@ class Basic(unittest.TestCase): sk_s = b"\x00" * 32 # usually urandom(32) vk_s, skvk_s = raw.publickey(sk_s) self.failUnlessEqual(len(vk_s), 32) - exp_vks = unhexlify("3b6a27bcceb6a42d62a3a8d02a6f0d73" - "653215771de243a63ac048a18b59da29") + exp_vks = unhexlify(b"3b6a27bcceb6a42d62a3a8d02a6f0d73" + b"653215771de243a63ac048a18b59da29") self.failUnlessEqual(vk_s, exp_vks) self.failUnlessEqual(skvk_s[:32], sk_s) self.failUnlessEqual(skvk_s[32:], vk_s) @@ -63,10 +63,10 @@ class Basic(unittest.TestCase): msg_and_sig = raw.sign(msg, skvk_s) sig = msg_and_sig[:-len(msg)] self.failUnlessEqual(len(sig), 64) - exp_sig = unhexlify("b0b47780f096ae60bfff8d8e7b19c36b" - "321ae6e69cca972f2ff987ef30f20d29" - "774b53bae404485c4391ddf1b3f37aaa" - "8a9747f984eb0884e8aa533386e73305") + exp_sig = unhexlify(b"b0b47780f096ae60bfff8d8e7b19c36b" + b"321ae6e69cca972f2ff987ef30f20d29" + b"774b53bae404485c4391ddf1b3f37aaa" + b"8a9747f984eb0884e8aa533386e73305") self.failUnlessEqual(sig, exp_sig) ret = raw.open(sig+msg, vk_s) # don't raise exception self.failUnlessEqual(ret, msg) @@ -112,8 +112,8 @@ class Basic(unittest.TestCase): def test_publickey(self): - seed = unhexlify("4ba96b0b5303328c7405220598a587c4" - "acb06ed9a9601d149f85400195f1ec3d") + seed = unhexlify(b"4ba96b0b5303328c7405220598a587c4" + b"acb06ed9a9601d149f85400195f1ec3d") sk = ed25519.SigningKey(seed) self.failUnlessEqual(hexlify(sk.to_bytes()), (b"4ba96b0b5303328c7405220598a587c4" @@ -129,46 +129,46 @@ class Basic(unittest.TestCase): self.failUnlessEqual(sk, sk2) def test_OOP(self): - sk_s = unhexlify("4ba96b0b5303328c7405220598a587c4" - "acb06ed9a9601d149f85400195f1ec3d" - "a66d161e090652b054740748f059f92a" - "5b731f1c27b05571f6d942e4f8b7b264") + sk_s = unhexlify(b"4ba96b0b5303328c7405220598a587c4" + b"acb06ed9a9601d149f85400195f1ec3d" + b"a66d161e090652b054740748f059f92a" + b"5b731f1c27b05571f6d942e4f8b7b264") sk = ed25519.SigningKey(sk_s) self.failUnlessEqual(len(sk.to_bytes()), 64) self.failUnlessEqual(sk.to_bytes(), sk_s) - sk2_seed = unhexlify("4ba96b0b5303328c7405220598a587c4" - "acb06ed9a9601d149f85400195f1ec3d") + sk2_seed = unhexlify(b"4ba96b0b5303328c7405220598a587c4" + b"acb06ed9a9601d149f85400195f1ec3d") sk2 = ed25519.SigningKey(sk2_seed) self.failUnlessEqual(sk2.to_bytes(), sk.to_bytes()) vk = sk.get_verifying_key() self.failUnlessEqual(len(vk.to_bytes()), 32) - exp_vks = unhexlify("a66d161e090652b054740748f059f92a" - "5b731f1c27b05571f6d942e4f8b7b264") + exp_vks = unhexlify(b"a66d161e090652b054740748f059f92a" + b"5b731f1c27b05571f6d942e4f8b7b264") self.failUnlessEqual(vk.to_bytes(), exp_vks) self.failUnlessEqual(ed25519.VerifyingKey(vk.to_bytes()), vk) msg = b"hello world" sig = sk.sign(msg) self.failUnlessEqual(len(sig), 64) - exp_sig = unhexlify("6eaffe94f2972b35158b6aaa9b69c1da" - "97f0896aca29c41b1dd7b32e6c9e2ff6" - "76fc8d8b034709cdcc37d8aeb86bebfb" - "173ace3c319e211ea1d7e8d8884c1808") + exp_sig = unhexlify(b"6eaffe94f2972b35158b6aaa9b69c1da" + b"97f0896aca29c41b1dd7b32e6c9e2ff6" + b"76fc8d8b034709cdcc37d8aeb86bebfb" + b"173ace3c319e211ea1d7e8d8884c1808") self.failUnlessEqual(sig, exp_sig) self.failUnlessEqual(vk.verify(sig, msg), None) # also, don't throw self.failUnlessRaises(ed25519.BadSignatureError, vk.verify, sig, msg+b".. NOT!") def test_object_identity(self): - sk1_s = unhexlify("ef32972ae3f1252a5aa1395347ea008c" - "bd2fed0773a4ea45e2d2d06c8cf8fbd4" - "c024601a9c5b854fb100ff3116cf4f22" - "a311565f027391cb49d3bbe11c44399d") - sk2_s = unhexlify("3d550c158900b4c2922b6656d2f80572" - "89de4ee65043745179685ae7d29b944d" - "672b8a2cb23f9e75e1d46ce249cd9c04" - "68f816f1c734a102822b60e18b41eacd") + sk1_s = unhexlify(b"ef32972ae3f1252a5aa1395347ea008c" + b"bd2fed0773a4ea45e2d2d06c8cf8fbd4" + b"c024601a9c5b854fb100ff3116cf4f22" + b"a311565f027391cb49d3bbe11c44399d") + sk2_s = unhexlify(b"3d550c158900b4c2922b6656d2f80572" + b"89de4ee65043745179685ae7d29b944d" + b"672b8a2cb23f9e75e1d46ce249cd9c04" + b"68f816f1c734a102822b60e18b41eacd") sk1a = ed25519.SigningKey(sk1_s) sk1b = ed25519.SigningKey(sk1_s) vk1a = sk1a.get_verifying_key() diff --git a/Linux_i686/lib/python3.4/site-packages/pkg_resources.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/__init__.py similarity index 85% rename from Linux_i686/lib/python3.4/site-packages/pkg_resources.py rename to Linux_i686/lib/python3.4/site-packages/pkg_resources/__init__.py index 517298c..0c024f1 100644 --- a/Linux_i686/lib/python3.4/site-packages/pkg_resources.py +++ b/Linux_i686/lib/python3.4/site-packages/pkg_resources/__init__.py @@ -14,12 +14,14 @@ The package resource API is designed to work with normal filesystem packages, method. """ +from __future__ import absolute_import + import sys import os import io import time import re -import imp +import types import zipfile import zipimport import warnings @@ -34,8 +36,15 @@ import collections import plistlib import email.parser import tempfile +import textwrap from pkgutil import get_importer +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + PY3 = sys.version_info > (3,) PY2 = not PY3 @@ -50,6 +59,8 @@ if PY3: else: string_types = str, eval('unicode') +iteritems = (lambda i: i.items()) if PY3 else lambda i: i.iteritems() + # capture these to bypass sandboxing from os import utime try: @@ -64,15 +75,160 @@ from os.path import isdir, split # Avoid try/except due to potential problems with delayed import mechanisms. if sys.version_info >= (3, 3) and sys.implementation.name == "cpython": - import importlib._bootstrap as importlib_bootstrap + import importlib.machinery as importlib_machinery else: - importlib_bootstrap = None + importlib_machinery = None try: import parser except ImportError: pass +try: + import pkg_resources._vendor.packaging.version + import pkg_resources._vendor.packaging.specifiers + packaging = pkg_resources._vendor.packaging +except ImportError: + # fallback to naturally-installed version; allows system packagers to + # omit vendored packages. + import packaging.version + import packaging.specifiers + + +if (3, 0) < sys.version_info < (3, 3): + msg = ( + "Support for Python 3.0-3.2 has been dropped. Future versions " + "will fail here." + ) + warnings.warn(msg) + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +class _SetuptoolsVersionMixin(object): + + def __hash__(self): + return super(_SetuptoolsVersionMixin, self).__hash__() + + def __lt__(self, other): + if isinstance(other, tuple): + return tuple(self) < other + else: + return super(_SetuptoolsVersionMixin, self).__lt__(other) + + def __le__(self, other): + if isinstance(other, tuple): + return tuple(self) <= other + else: + return super(_SetuptoolsVersionMixin, self).__le__(other) + + def __eq__(self, other): + if isinstance(other, tuple): + return tuple(self) == other + else: + return super(_SetuptoolsVersionMixin, self).__eq__(other) + + def __ge__(self, other): + if isinstance(other, tuple): + return tuple(self) >= other + else: + return super(_SetuptoolsVersionMixin, self).__ge__(other) + + def __gt__(self, other): + if isinstance(other, tuple): + return tuple(self) > other + else: + return super(_SetuptoolsVersionMixin, self).__gt__(other) + + def __ne__(self, other): + if isinstance(other, tuple): + return tuple(self) != other + else: + return super(_SetuptoolsVersionMixin, self).__ne__(other) + + def __getitem__(self, key): + return tuple(self)[key] + + def __iter__(self): + component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) + replace = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + }.get + + def _parse_version_parts(s): + for part in component_re.split(s): + part = replace(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 old_parse_version(s): + parts = [] + for part in _parse_version_parts(s.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) + return tuple(parts) + + # Warn for use of this function + warnings.warn( + "You have iterated over the result of " + "pkg_resources.parse_version. This is a legacy behavior which is " + "inconsistent with the new version class introduced in setuptools " + "8.0. In most cases, conversion to a tuple is unnecessary. For " + "comparison of versions, sort the Version instances directly. If " + "you have another use case requiring the tuple, please file a " + "bug with the setuptools project describing that need.", + RuntimeWarning, + stacklevel=1, + ) + + for part in old_parse_version(str(self)): + yield part + + +class SetuptoolsVersion(_SetuptoolsVersionMixin, packaging.version.Version): + pass + + +class SetuptoolsLegacyVersion(_SetuptoolsVersionMixin, + packaging.version.LegacyVersion): + pass + + +def parse_version(v): + try: + return SetuptoolsVersion(v) + except packaging.version.InvalidVersion: + return SetuptoolsLegacyVersion(v) + _state_vars = {} @@ -153,6 +309,9 @@ __all__ = [ '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', @@ -180,12 +339,79 @@ class ResolutionError(Exception): def __repr__(self): return self.__class__.__name__+repr(self.args) + class VersionConflict(ResolutionError): - """An already-installed version conflicts with the requested version""" + """ + 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 = {} @@ -490,8 +716,7 @@ class WorkingSet(object): if dist is not None and dist not in req: # XXX add more info raise VersionConflict(dist, req) - else: - return dist + return dist def iter_entry_points(self, group, name=None): """Yield entry point objects from `group` matching `name` @@ -590,6 +815,10 @@ class WorkingSet(object): best = {} to_activate = [] + # 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) @@ -613,19 +842,22 @@ class WorkingSet(object): ws = WorkingSet([]) dist = best[req.key] = env.best_match(req, ws, installer) if dist is None: - #msg = ("The '%s' distribution was not found on this " - # "system, and is required by this application.") - #raise DistributionNotFound(msg % req) - - # unfortunately, zc.buildout uses a str(err) - # to get the name of the distribution here.. - raise DistributionNotFound(req) + 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 - # XXX put more info here - raise VersionConflict(dist, req) - requirements.extend(dist.requires(req.extras)[::-1]) + 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) + processed[req] = True # return list of distros to activate @@ -693,8 +925,7 @@ class WorkingSet(object): try: resolvees = shadow_set.resolve(req, env, installer) - except ResolutionError: - v = sys.exc_info()[1] + except ResolutionError as v: # save error info error_info[dist] = v if fallback: @@ -1143,13 +1374,15 @@ def safe_name(name): def safe_version(version): - """Convert an arbitrary string to a standard version string - - Spaces become dots, and all other non-alphanumeric characters become - dashes, with runs of multiple dashes condensed to a single dash. """ - version = version.replace(' ','.') - return re.sub('[^A-Za-z0-9.]+', '-', version) + 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): @@ -1177,6 +1410,7 @@ class MarkerEvaluation(object): 'python_version': lambda: platform.python_version()[:3], 'platform_version': platform.version, 'platform_machine': platform.machine, + 'platform_python_implementation': platform.python_implementation, 'python_implementation': platform.python_implementation, } @@ -1188,8 +1422,8 @@ class MarkerEvaluation(object): """ try: cls.evaluate_marker(text) - except SyntaxError: - return cls.normalize_exception(sys.exc_info()[1]) + except SyntaxError as e: + return cls.normalize_exception(e) return False @staticmethod @@ -1269,6 +1503,10 @@ class MarkerEvaluation(object): 'in': lambda x, y: x in y, '==': operator.eq, '!=': operator.ne, + '<': operator.lt, + '>': operator.gt, + '<=': operator.le, + '>=': operator.ge, } if hasattr(symbol, 'or_test'): ops[symbol.or_test] = cls.test @@ -1288,6 +1526,17 @@ class MarkerEvaluation(object): """ return cls.interpret(parser.expr(text).totuple(1)[1]) + @staticmethod + def _translate_metadata2(env): + """ + Markerlib implements Metadata 1.2 (PEP 345) environment markers. + Translate the variables to Metadata 2.0 (PEP 426). + """ + return dict( + (key.replace('.', '_'), value) + for key, value in env + ) + @classmethod def _markerlib_evaluate(cls, text): """ @@ -1296,16 +1545,11 @@ class MarkerEvaluation(object): Raise SyntaxError if marker is invalid. """ import _markerlib - # markerlib implements Metadata 1.2 (PEP 345) environment markers. - # Translate the variables to Metadata 2.0 (PEP 426). - env = _markerlib.default_environment() - for key in env.keys(): - new_key = key.replace('.', '_') - env[new_key] = env.pop(key) + + env = cls._translate_metadata2(_markerlib.default_environment()) try: result = _markerlib.interpret(text, env) - except NameError: - e = sys.exc_info()[1] + except NameError as e: raise SyntaxError(e.args[0]) return result @@ -1472,7 +1716,7 @@ class EggProvider(NullProvider): path = self.module_path old = None while path!=old: - if path.lower().endswith('.egg'): + if _is_unpacked_egg(path): self.egg_name = os.path.basename(path) self.egg_info = os.path.join(path, 'EGG-INFO') self.egg_root = path @@ -1501,8 +1745,8 @@ class DefaultProvider(EggProvider): register_loader_type(type(None), DefaultProvider) -if importlib_bootstrap is not None: - register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider) +if importlib_machinery is not None: + register_loader_type(importlib_machinery.SourceFileLoader, DefaultProvider) class EmptyProvider(NullProvider): @@ -1855,7 +2099,7 @@ def find_eggs_in_zip(importer, path_item, only=False): # don't yield nested distros return for subitem in metadata.resource_listdir('/'): - if subitem.endswith('.egg'): + if _is_unpacked_egg(subitem): subpath = os.path.join(path_item, subitem) for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath): yield dist @@ -1871,8 +2115,7 @@ def find_on_path(importer, path_item, only=False): path_item = _normalize_cached(path_item) if os.path.isdir(path_item) and os.access(path_item, os.R_OK): - if path_item.lower().endswith('.egg'): - # unpacked egg + if _is_unpacked_egg(path_item): yield Distribution.from_filename( path_item, metadata=PathMetadata( path_item, os.path.join(path_item,'EGG-INFO') @@ -1892,7 +2135,7 @@ def find_on_path(importer, path_item, only=False): yield Distribution.from_location( path_item, entry, metadata, precedence=DEVELOP_DIST ) - elif not only and lower.endswith('.egg'): + elif not only and _is_unpacked_egg(entry): dists = find_distributions(os.path.join(path_item, entry)) for dist in dists: yield dist @@ -1909,8 +2152,8 @@ def find_on_path(importer, path_item, only=False): break register_finder(pkgutil.ImpImporter, find_on_path) -if importlib_bootstrap is not None: - register_finder(importlib_bootstrap.FileFinder, find_on_path) +if importlib_machinery is not None: + register_finder(importlib_machinery.FileFinder, find_on_path) _declare_state('dict', _namespace_handlers={}) _declare_state('dict', _namespace_packages={}) @@ -1944,7 +2187,7 @@ def _handle_ns(packageName, path_item): return None module = sys.modules.get(packageName) if module is None: - module = sys.modules[packageName] = imp.new_module(packageName) + module = sys.modules[packageName] = types.ModuleType(packageName) module.__path__ = [] _set_parent_ns(packageName) elif not hasattr(module,'__path__'): @@ -1963,7 +2206,7 @@ def _handle_ns(packageName, path_item): def declare_namespace(packageName): """Declare that package 'packageName' is a namespace package""" - imp.acquire_lock() + _imp.acquire_lock() try: if packageName in _namespace_packages: return @@ -1990,18 +2233,18 @@ def declare_namespace(packageName): _handle_ns(packageName, path_item) finally: - imp.release_lock() + _imp.release_lock() def fixup_namespace_packages(path_item, parent=None): """Ensure that previously-declared namespace packages include path_item""" - imp.acquire_lock() + _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() + _imp.release_lock() def file_ns_handler(importer, path_item, packageName, module): """Compute an ns-package subpath for a filesystem or zipfile importer""" @@ -2018,8 +2261,8 @@ def file_ns_handler(importer, path_item, packageName, module): register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) register_namespace_handler(zipimport.zipimporter, file_ns_handler) -if importlib_bootstrap is not None: - register_namespace_handler(importlib_bootstrap.FileFinder, file_ns_handler) +if importlib_machinery is not None: + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) def null_ns_handler(importer, path_item, packageName, module): @@ -2039,6 +2282,14 @@ def _normalize_cached(filename, _cache={}): _cache[filename] = result = normalize_path(filename) return result +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + path.lower().endswith('.egg') + ) + def _set_parent_ns(packageName): parts = packageName.split('.') name = parts.pop() @@ -2067,79 +2318,25 @@ CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match # Distribution or extra DISTRO = re.compile(r"\s*((\w|[-.])+)").match # ver. info -VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match +VERSION = re.compile(r"\s*(<=?|>=?|===?|!=|~=)\s*((\w|[-.*_!+])+)").match # comma between items COMMA = re.compile(r"\s*,").match OBRACKET = re.compile(r"\s*\[").match CBRACKET = re.compile(r"\s*\]").match MODULE = re.compile(r"\w+(\.\w+)*$").match EGG_NAME = re.compile( - r"(?P[^-]+)" - r"( -(?P[^-]+) (-py(?P[^-]+) (-(?P.+))? )? )?", - re.VERBOSE | re.IGNORECASE + r""" + (?P[^-]+) ( + -(?P[^-]+) ( + -py(?P[^-]+) ( + -(?P.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, ).match -component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE) -replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get - -def _parse_version_parts(s): - for part in component_re.split(s): - part = replace(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 parse_version(s): - """Convert a version string to a chronologically-sortable key - - This is a rough cross between distutils' StrictVersion and LooseVersion; - if you give it versions that would work with StrictVersion, then it behaves - the same; otherwise it acts like a slightly-smarter LooseVersion. It is - *possible* to create pathological version coding schemes that will fool - this parser, but they should be very rare in practice. - - The returned value will be a tuple of strings. Numeric portions of the - version are padded to 8 digits so they will compare numerically, but - without relying on how numbers compare relative to strings. Dots are - dropped, but dashes are retained. Trailing zeros between alpha segments - or dashes are suppressed, so that e.g. "2.4.0" is considered the same as - "2.4". Alphanumeric parts are lower-cased. - - The algorithm assumes that strings like "-" and any alpha string that - alphabetically follows "final" represents a "patch level". So, "2.4-1" - is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is - considered newer than "2.4-1", which in turn is newer than "2.4". - - Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that - come before "final" alphabetically) are assumed to be pre-release versions, - so that the version "2.4" is considered newer than "2.4a1". - - Finally, to handle miscellaneous cases, the strings "pre", "preview", and - "rc" are treated as if they were "c", i.e. as though they were release - candidates, and therefore are not as new as a version string that does not - contain them, and "dev" is replaced with an '@' so that it sorts lower than - than any other pre-release tag. - """ - parts = [] - for part in _parse_version_parts(s.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) - return tuple(parts) - class EntryPoint(object): """Object representing an advertised importable object""" @@ -2164,17 +2361,30 @@ class EntryPoint(object): def __repr__(self): return "EntryPoint.parse(%r)" % str(self) - def load(self, require=True, env=None, installer=None): + 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.", + DeprecationWarning, + stacklevel=2, + ) if require: - self.require(env, installer) - entry = __import__(self.module_name, globals(), globals(), - ['__name__']) - for attr in self.attrs: - try: - entry = getattr(entry, attr) - except AttributeError: - raise ImportError("%r has no %r attribute" % (entry, attr)) - return entry + 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: @@ -2183,6 +2393,15 @@ class EntryPoint(object): items = working_set.resolve(reqs, env, installer) list(map(working_set.add, items)) + pattern = re.compile( + r'\s*' + r'(?P.+?)\s*' + r'=\s*' + r'(?P[\w.]+)\s*' + r'(:\s*(?P[\w.]+))?\s*' + r'(?P\[.*\])?\s*$' + ) + @classmethod def parse(cls, src, dist=None): """Parse a single entry point from string `src` @@ -2194,25 +2413,23 @@ class EntryPoint(object): The entry name and module name are required, but the ``:attrs`` and ``[extras]`` parts are optional """ - try: - attrs = extras = () - name, value = src.split('=', 1) - if '[' in value: - value, extras = value.split('[', 1) - req = Requirement.parse("x[" + extras) - if req.specs: - raise ValueError - extras = req.extras - if ':' in value: - value, attrs = value.split(':', 1) - if not MODULE(attrs.rstrip()): - raise ValueError - attrs = attrs.rstrip().split('.') - except ValueError: + m = cls.pattern.match(src) + if not m: msg = "EntryPoint must be in 'name=module:attrs [extras]' format" raise ValueError(msg, src) - else: - return cls(name.strip(), value.strip(), attrs, extras, dist) + 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): @@ -2292,12 +2509,12 @@ class Distribution(object): @property def hashcmp(self): return ( - getattr(self, 'parsed_version', ()), + self.parsed_version, self.precedence, self.key, _remove_md5_fragment(self.location), - self.py_version, - self.platform, + self.py_version or '', + self.platform or '', ) def __hash__(self): @@ -2338,11 +2555,36 @@ class Distribution(object): @property def parsed_version(self): - try: - return self._parsed_version - except AttributeError: - self._parsed_version = pv = parse_version(self.version) - return pv + 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): @@ -2447,7 +2689,12 @@ class Distribution(object): def as_requirement(self): """Return a ``Requirement`` that matches this distribution exactly""" - return Requirement.parse('%s==%s' % (self.project_name, self.version)) + 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""" @@ -2638,6 +2885,11 @@ def issue_warning(*args,**kw): warnings.warn(stacklevel=level + 1, *args, **kw) +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + def parse_requirements(strs): """Yield ``Requirement`` objects for each specification in `strs` @@ -2656,14 +2908,13 @@ def parse_requirements(strs): line = next(lines) p = 0 except StopIteration: - raise ValueError( - "\\ must not appear on the last nonblank line" - ) + msg = "\\ must not appear on the last nonblank line" + raise RequirementParseError(msg) match = ITEM(line, p) if not match: msg = "Expected " + item_name + " in" - raise ValueError(msg, line, "at", line[p:]) + raise RequirementParseError(msg, line, "at", line[p:]) items.append(match.group(*groups)) p = match.end() @@ -2674,7 +2925,7 @@ def parse_requirements(strs): p = match.end() elif not TERMINATOR(line, p): msg = "Expected ',' or end-of-list in" - raise ValueError(msg, line, "at", line[p:]) + raise RequirementParseError(msg, line, "at", line[p:]) match = TERMINATOR(line, p) # skip the terminator, if any @@ -2685,7 +2936,7 @@ def parse_requirements(strs): for line in lines: match = DISTRO(line) if not match: - raise ValueError("Missing distribution spec", line) + raise RequirementParseError("Missing distribution spec", line) project_name = match.group(1) p = match.end() extras = [] @@ -2699,7 +2950,7 @@ def parse_requirements(strs): line, p, specs = scan_list(VERSION, LINE_END, line, p, (1, 2), "version spec") - specs = [(op, safe_version(val)) for op, val in specs] + specs = [(op, val) for op, val in specs] yield Requirement(project_name, specs, extras) @@ -2708,26 +2959,23 @@ class Requirement: """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" self.unsafe_name, project_name = project_name, safe_name(project_name) self.project_name, self.key = project_name, project_name.lower() - index = [ - (parse_version(v), state_machine[op], op, v) - for op, v in specs - ] - index.sort() - self.specs = [(op, ver) for parsed, trans, op, ver in index] - self.index, self.extras = index, tuple(map(safe_extra, extras)) + self.specifier = packaging.specifiers.SpecifierSet( + ",".join(["".join([x, y]) for x, y in specs]) + ) + self.specs = specs + self.extras = tuple(map(safe_extra, extras)) self.hashCmp = ( self.key, - tuple((op, parsed) for parsed, trans, op, ver in index), + self.specifier, frozenset(self.extras), ) self.__hash = hash(self.hashCmp) def __str__(self): - specs = ','.join([''.join(s) for s in self.specs]) extras = ','.join(self.extras) if extras: extras = '[%s]' % extras - return '%s%s%s' % (self.project_name, extras, specs) + return '%s%s%s' % (self.project_name, extras, self.specifier) def __eq__(self, other): return ( @@ -2735,33 +2983,20 @@ class Requirement: 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 - # only get if we need it - if self.index: - item = item.parsed_version - elif isinstance(item, string_types): - item = parse_version(item) - last = None - # -1, 0, 1 - compare = lambda a, b: (a > b) - (a < b) - for parsed, trans, op, ver in self.index: - # Indexing: 0, 1, -1 - action = trans[compare(item, parsed)] - if action == 'F': - return False - elif action == 'T': - return True - elif action == '+': - last = True - elif action == '-' or last is None: - last = False - # no rules encountered - if last is None: - last = True - return last + + 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 @@ -2770,22 +3005,8 @@ class Requirement: @staticmethod def parse(s): - reqs = list(parse_requirements(s)) - if reqs: - if len(reqs) == 1: - return reqs[0] - raise ValueError("Expected only one requirement", s) - raise ValueError("No requirements found", s) - -state_machine = { - # =>< - '<': '--T', - '<=': 'T-T', - '>': 'F+F', - '>=': 'T+F', - '==': 'T..', - '!=': 'F++', -} + req, = parse_requirements(s) + return req def _get_mro(cls): @@ -2809,14 +3030,14 @@ def ensure_directory(path): os.makedirs(dirname) -def _bypass_ensure_directory(path, mode=0o777): +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) - mkdir(dirname, mode) + mkdir(dirname, 0o755) def split_sections(s): @@ -2855,28 +3076,56 @@ def _mkstemp(*args,**kw): os.open = old_open -# Set up global resource manager (deliberately not state-saved) -_manager = ResourceManager() -def _initialize(g): - for name in dir(_manager): +# 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 + for name in dir(manager): if not name.startswith('_'): - g[name] = getattr(_manager, name) -_initialize(globals()) + g[name] = getattr(manager, name) -# Prepare the master working set and make the ``require()`` API available -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, and ensure that -# all distributions added to the working set in the future (e.g. by -# calling ``require()``) will get activated as well. -add_activation_listener(lambda dist: dist.activate()) -working_set.entries=[] -# match order -list(map(working_set.add_entry, sys.path)) +@_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, and ensure that + # all distributions added to the working set in the future (e.g. by + # calling ``require()``) will get activated as well. + add_activation_listener(lambda dist: dist.activate()) + working_set.entries=[] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/__init__.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/__init__.py similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/__init__.py rename to Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/__init__.py diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/__about__.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py similarity index 98% rename from Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/__about__.py rename to Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py index b64681e..eadb794 100644 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/__about__.py +++ b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -22,7 +22,7 @@ __title__ = "packaging" __summary__ = "Core utilities for Python packages" __uri__ = "https://github.com/pypa/packaging" -__version__ = "14.2" +__version__ = "15.3" __author__ = "Donald Stufft" __email__ = "donald@stufft.io" diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/__init__.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__init__.py similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/__init__.py rename to Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/__init__.py diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/_compat.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py similarity index 63% rename from Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/_compat.py rename to Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py index f2ff383..5c396ce 100644 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/_compat.py +++ b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -25,3 +25,16 @@ 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/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/_structures.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_structures.py similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/_structures.py rename to Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/_structures.py diff --git a/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..891664f --- /dev/null +++ b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,784 @@ +# Copyright 2014 Donald Stufft +# +# 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. +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 = re.compile( + r""" + ^ + \s* + (?P(==|!=|<=|>=|<|>)) + \s* + (?P + [^\s]* # We just match everything, except for whitespace since this + # is a "legacy" specifier and the version string can be just + # about anything. + ) + \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 = re.compile( + r""" + ^ + \s* + (?P(~=|==|!=|<=|>=|<|>|===)) + (?P + (?: + # 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. + (?=": "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(".*"): + # 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):]) + right_split.append(left[len(right_split):]) + + # 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 "".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/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000..4ba574b --- /dev/null +++ b/Linux_i686/lib/python3.4/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,403 @@ +# Copyright 2014 Donald Stufft +# +# 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. +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 "".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[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P
                                          # pre-release
+            [-_\.]?
+            (?P(a|b|c|rc|alpha|beta|pre|preview))
+            [-_\.]?
+            (?P[0-9]+)?
+        )?
+        (?P                                         # post release
+            (?:-(?P[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?Ppost|rev|r)
+                [-_\.]?
+                (?P[0-9]+)?
+            )
+        )?
+        (?P                                          # dev release
+            [-_\.]?
+            (?Pdev)
+            [-_\.]?
+            (?P[0-9]+)?
+        )?
+    )
+    (?:\+(?P[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 "".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/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/PKG-INFO b/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/PKG-INFO
deleted file mode 100644
index c9b3f06..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/PKG-INFO
+++ /dev/null
@@ -1,30 +0,0 @@
-Metadata-Version: 1.1
-Name: pyOpenSSL
-Version: 0.14
-Summary: Python wrapper module around the OpenSSL library
-Home-page: https://github.com/pyca/pyopenssl
-Author: Jean-Paul Calderone
-Author-email: exarkun@twistedmatrix.com
-License: APL2
-Description: High-level wrapper around a subset of the OpenSSL library, includes
-         * SSL.Connection objects, wrapping the methods of Python's portable
-           sockets
-         * Callbacks written in Python
-         * Extensive error-handling mechanism, mirroring OpenSSL's error codes
-        ...  and much more ;)
-Platform: UNKNOWN
-Classifier: Development Status :: 6 - Mature
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Apache Software License
-Classifier: Operating System :: MacOS :: MacOS X
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Operating System :: POSIX
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: Implementation :: CPython
-Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Topic :: Security :: Cryptography
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: System :: Networking
diff --git a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/SOURCES.txt b/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/SOURCES.txt
deleted file mode 100644
index a89c12e..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,58 +0,0 @@
-ChangeLog
-INSTALL
-LICENSE
-MANIFEST.in
-README
-TODO
-setup.cfg
-setup.py
-OpenSSL/RATIONALE
-OpenSSL/SSL.py
-OpenSSL/__init__.py
-OpenSSL/_util.py
-OpenSSL/crypto.py
-OpenSSL/rand.py
-OpenSSL/tsafe.py
-OpenSSL/version.py
-OpenSSL/test/__init__.py
-OpenSSL/test/test_crypto.py
-OpenSSL/test/test_rand.py
-OpenSSL/test/test_ssl.py
-OpenSSL/test/util.py
-doc/Makefile
-doc/Quotes
-doc/README
-doc/api.rst
-doc/conf.py
-doc/index.rst
-doc/internals.rst
-doc/introduction.rst
-doc/make.bat
-doc/api/crypto.rst
-doc/api/rand.rst
-doc/api/ssl.rst
-doc/images/pyopenssl-brand.png
-doc/images/pyopenssl-icon.png
-doc/images/pyopenssl-logo.png
-doc/images/pyopenssl.svg
-examples/README
-examples/SecureXMLRPCServer.py
-examples/certgen.py
-examples/mk_simple_certs.py
-examples/proxy.py
-examples/simple/README
-examples/simple/client.py
-examples/simple/server.py
-examples/sni/README
-examples/sni/another.invalid.crt
-examples/sni/another.invalid.key
-examples/sni/client.py
-examples/sni/example.invalid.crt
-examples/sni/example.invalid.key
-examples/sni/server.py
-pyOpenSSL.egg-info/PKG-INFO
-pyOpenSSL.egg-info/SOURCES.txt
-pyOpenSSL.egg-info/dependency_links.txt
-pyOpenSSL.egg-info/requires.txt
-pyOpenSSL.egg-info/top_level.txt
-rpm/build_script
\ No newline at end of file
diff --git a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/installed-files.txt
deleted file mode 100644
index 9bb22dd..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/installed-files.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-../OpenSSL/__init__.py
-../OpenSSL/tsafe.py
-../OpenSSL/rand.py
-../OpenSSL/crypto.py
-../OpenSSL/SSL.py
-../OpenSSL/version.py
-../OpenSSL/test/__init__.py
-../OpenSSL/test/util.py
-../OpenSSL/test/test_crypto.py
-../OpenSSL/test/test_rand.py
-../OpenSSL/test/test_ssl.py
-../OpenSSL/_util.py
-../OpenSSL/__pycache__/__init__.cpython-34.pyc
-../OpenSSL/__pycache__/tsafe.cpython-34.pyc
-../OpenSSL/__pycache__/rand.cpython-34.pyc
-../OpenSSL/__pycache__/crypto.cpython-34.pyc
-../OpenSSL/__pycache__/SSL.cpython-34.pyc
-../OpenSSL/__pycache__/version.cpython-34.pyc
-../OpenSSL/test/__pycache__/__init__.cpython-34.pyc
-../OpenSSL/test/__pycache__/util.cpython-34.pyc
-../OpenSSL/test/__pycache__/test_crypto.cpython-34.pyc
-../OpenSSL/test/__pycache__/test_rand.cpython-34.pyc
-../OpenSSL/test/__pycache__/test_ssl.cpython-34.pyc
-../OpenSSL/__pycache__/_util.cpython-34.pyc
-./
-dependency_links.txt
-PKG-INFO
-SOURCES.txt
-top_level.txt
-requires.txt
diff --git a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/requires.txt b/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/requires.txt
deleted file mode 100644
index b4eef99..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/requires.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-cryptography>=0.2.1
-six>=1.5.2
diff --git a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/top_level.txt
deleted file mode 100644
index effce34..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pyOpenSSL-0.14.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-OpenSSL
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/PKG-INFO b/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/PKG-INFO
deleted file mode 100644
index da5af06..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/PKG-INFO
+++ /dev/null
@@ -1,17 +0,0 @@
-Metadata-Version: 1.1
-Name: pycparser
-Version: 2.10
-Summary: C parser in Python
-Home-page: https://github.com/eliben/pycparser
-Author: Eli Bendersky
-Author-email: eliben@gmail.com
-License: BSD
-Description: 
-                pycparser is a complete parser of the C language, written in
-                pure Python using the PLY parsing library.
-                It parses C code into an AST and can serve as a front-end for
-                C compilers or analysis tools.
-            
-Platform: Cross Platform
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 3
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/SOURCES.txt b/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/SOURCES.txt
deleted file mode 100644
index 88cea85..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-README.rst
-pycparser/__init__.py
-pycparser/_ast_gen.py
-pycparser/_build_tables.py
-pycparser/_c_ast.cfg
-pycparser/ast_transforms.py
-pycparser/c_ast.py
-pycparser/c_generator.py
-pycparser/c_lexer.py
-pycparser/c_parser.py
-pycparser/lextab.py
-pycparser/plyparser.py
-pycparser/yacctab.py
-pycparser.egg-info/PKG-INFO
-pycparser.egg-info/SOURCES.txt
-pycparser.egg-info/dependency_links.txt
-pycparser.egg-info/top_level.txt
-pycparser/ply/__init__.py
-pycparser/ply/cpp.py
-pycparser/ply/ctokens.py
-pycparser/ply/lex.py
-pycparser/ply/yacc.py
\ No newline at end of file
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/dependency_links.txt
deleted file mode 100644
index 8b13789..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/installed-files.txt b/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/installed-files.txt
deleted file mode 100644
index 8746535..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/installed-files.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-../pycparser/c_generator.py
-../pycparser/lextab.py
-../pycparser/yacctab.py
-../pycparser/_ast_gen.py
-../pycparser/__init__.py
-../pycparser/c_lexer.py
-../pycparser/c_ast.py
-../pycparser/plyparser.py
-../pycparser/c_parser.py
-../pycparser/_build_tables.py
-../pycparser/ast_transforms.py
-../pycparser/ply/yacc.py
-../pycparser/ply/lex.py
-../pycparser/ply/__init__.py
-../pycparser/ply/cpp.py
-../pycparser/ply/ctokens.py
-../pycparser/_c_ast.cfg
-../pycparser/__pycache__/c_generator.cpython-34.pyc
-../pycparser/__pycache__/lextab.cpython-34.pyc
-../pycparser/__pycache__/yacctab.cpython-34.pyc
-../pycparser/__pycache__/_ast_gen.cpython-34.pyc
-../pycparser/__pycache__/__init__.cpython-34.pyc
-../pycparser/__pycache__/c_lexer.cpython-34.pyc
-../pycparser/__pycache__/c_ast.cpython-34.pyc
-../pycparser/__pycache__/plyparser.cpython-34.pyc
-../pycparser/__pycache__/c_parser.cpython-34.pyc
-../pycparser/__pycache__/_build_tables.cpython-34.pyc
-../pycparser/__pycache__/ast_transforms.cpython-34.pyc
-../pycparser/ply/__pycache__/yacc.cpython-34.pyc
-../pycparser/ply/__pycache__/lex.cpython-34.pyc
-../pycparser/ply/__pycache__/__init__.cpython-34.pyc
-../pycparser/ply/__pycache__/cpp.cpython-34.pyc
-../pycparser/ply/__pycache__/ctokens.cpython-34.pyc
-./
-dependency_links.txt
-PKG-INFO
-SOURCES.txt
-top_level.txt
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/top_level.txt
deleted file mode 100644
index dc1c9e1..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser-2.10-py3.4.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-pycparser
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/__init__.py b/Linux_i686/lib/python3.4/site-packages/pycparser/__init__.py
deleted file mode 100644
index 86d1c5c..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/__init__.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#-----------------------------------------------------------------
-# pycparser: __init__.py
-#
-# This package file exports some convenience functions for
-# interacting with pycparser
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-__all__ = ['c_lexer', 'c_parser', 'c_ast']
-__version__ = '2.10'
-
-from subprocess import Popen, PIPE
-from .c_parser import CParser
-
-
-def preprocess_file(filename, cpp_path='cpp', cpp_args=''):
-    """ Preprocess a file using cpp.
-
-        filename:
-            Name of the file you want to preprocess.
-
-        cpp_path:
-        cpp_args:
-            Refer to the documentation of parse_file for the meaning of these
-            arguments.
-
-        When successful, returns the preprocessed file's contents.
-        Errors from cpp will be printed out.
-    """
-    path_list = [cpp_path]
-    if isinstance(cpp_args, list):
-        path_list += cpp_args
-    elif cpp_args != '':
-        path_list += [cpp_args]
-    path_list += [filename]
-
-    try:
-        # Note the use of universal_newlines to treat all newlines
-        # as \n for Python's purpose
-        #
-        pipe = Popen(   path_list,
-                        stdout=PIPE,
-                        universal_newlines=True)
-        text = pipe.communicate()[0]
-    except OSError as e:
-        raise RuntimeError("Unable to invoke 'cpp'.  " +
-            'Make sure its path was passed correctly\n' +
-            ('Original error: %s' % e))
-
-    return text
-
-
-def parse_file(filename, use_cpp=False, cpp_path='cpp', cpp_args='',
-               parser=None):
-    """ Parse a C file using pycparser.
-
-        filename:
-            Name of the file you want to parse.
-
-        use_cpp:
-            Set to True if you want to execute the C pre-processor
-            on the file prior to parsing it.
-
-        cpp_path:
-            If use_cpp is True, this is the path to 'cpp' on your
-            system. If no path is provided, it attempts to just
-            execute 'cpp', so it must be in your PATH.
-
-        cpp_args:
-            If use_cpp is True, set this to the command line arguments strings
-            to cpp. Be careful with quotes - it's best to pass a raw string
-            (r'') here. For example:
-            r'-I../utils/fake_libc_include'
-            If several arguments are required, pass a list of strings.
-
-        parser:
-            Optional parser object to be used instead of the default CParser
-
-        When successful, an AST is returned. ParseError can be
-        thrown if the file doesn't parse successfully.
-
-        Errors from cpp will be printed out.
-    """
-    if use_cpp:
-        text = preprocess_file(filename, cpp_path, cpp_args)
-    else:
-        with open(filename, 'rU') as f:
-            text = f.read()
-
-    if parser is None:
-        parser = CParser()
-    return parser.parse(text, filename)
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/_ast_gen.py b/Linux_i686/lib/python3.4/site-packages/pycparser/_ast_gen.py
deleted file mode 100644
index 5e76456..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/_ast_gen.py
+++ /dev/null
@@ -1,273 +0,0 @@
-#-----------------------------------------------------------------
-# _ast_gen.py
-#
-# Generates the AST Node classes from a specification given in 
-# a .yaml file
-#
-# The design of this module was inspired by astgen.py from the
-# Python 2.5 code-base.
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-import pprint
-from string import Template
-
-
-class ASTCodeGenerator(object):
-    def __init__(self, cfg_filename='_c_ast.cfg'):
-        """ Initialize the code generator from a configuration
-            file.
-        """
-        self.cfg_filename = cfg_filename
-        self.node_cfg = [NodeCfg(name, contents) 
-            for (name, contents) in self.parse_cfgfile(cfg_filename)]
-
-    def generate(self, file=None):
-        """ Generates the code into file, an open file buffer.
-        """
-        src = Template(_PROLOGUE_COMMENT).substitute(
-            cfg_filename=self.cfg_filename)
-        
-        src += _PROLOGUE_CODE
-        for node_cfg in self.node_cfg:
-            src += node_cfg.generate_source() + '\n\n'
-        
-        file.write(src)
-
-    def parse_cfgfile(self, filename):
-        """ Parse the configuration file and yield pairs of
-            (name, contents) for each node.
-        """
-        with open(filename, "r") as f:
-            for line in f:
-                line = line.strip()
-                if not line or line.startswith('#'):
-                    continue
-                colon_i = line.find(':')
-                lbracket_i = line.find('[')
-                rbracket_i = line.find(']')
-                if colon_i < 1 or lbracket_i <= colon_i or rbracket_i <= lbracket_i:
-                    raise RuntimeError("Invalid line in %s:\n%s\n" % (filename, line))
-
-                name = line[:colon_i]
-                val = line[lbracket_i + 1:rbracket_i]
-                vallist = [v.strip() for v in val.split(',')] if val else []
-                yield name, vallist
-
-
-class NodeCfg(object):
-    """ Node configuration. 
-
-        name: node name
-        contents: a list of contents - attributes and child nodes 
-        See comment at the top of the configuration file for details.
-    """
-    def __init__(self, name, contents):
-        self.name = name
-        self.all_entries = []
-        self.attr = []
-        self.child = []
-        self.seq_child = []
-
-        for entry in contents:
-            clean_entry = entry.rstrip('*')
-            self.all_entries.append(clean_entry)
-            
-            if entry.endswith('**'):
-                self.seq_child.append(clean_entry)
-            elif entry.endswith('*'):
-                self.child.append(clean_entry)
-            else:
-                self.attr.append(entry)
-
-    def generate_source(self):
-        src = self._gen_init()
-        src += '\n' + self._gen_children()
-        src += '\n' + self._gen_attr_names()
-        return src
-    
-    def _gen_init(self):
-        src = "class %s(Node):\n" % self.name
-
-        if self.all_entries:
-            args = ', '.join(self.all_entries)
-            arglist = '(self, %s, coord=None)' % args
-        else:
-            arglist = '(self, coord=None)'
-        
-        src += "    def __init__%s:\n" % arglist
-        
-        for name in self.all_entries + ['coord']:
-            src += "        self.%s = %s\n" % (name, name)
-        
-        return src
-
-    def _gen_children(self):
-        src = '    def children(self):\n'
-        
-        if self.all_entries:
-            src += '        nodelist = []\n'
-
-            for child in self.child:
-                src += (
-                    '        if self.%(child)s is not None:' +
-                    ' nodelist.append(("%(child)s", self.%(child)s))\n') % (
-                        dict(child=child))
-                
-            for seq_child in self.seq_child:
-                src += (
-                    '        for i, child in enumerate(self.%(child)s or []):\n'
-                    '            nodelist.append(("%(child)s[%%d]" %% i, child))\n') % (
-                        dict(child=seq_child))
-                    
-            src += '        return tuple(nodelist)\n'
-        else:
-            src += '        return ()\n'
-            
-        return src        
-
-    def _gen_attr_names(self):
-        src = "    attr_names = (" + ''.join("%r," % nm for nm in self.attr) + ')' 
-        return src
-
-
-_PROLOGUE_COMMENT = \
-r'''#-----------------------------------------------------------------
-# ** ATTENTION **
-# This code was automatically generated from the file:
-# $cfg_filename 
-#
-# Do not modify it directly. Modify the configuration file and
-# run the generator again.
-# ** ** *** ** **
-#
-# pycparser: c_ast.py
-#
-# AST Node classes.
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-
-'''
-
-_PROLOGUE_CODE = r'''
-import sys
-
-
-class Node(object):
-    """ Abstract base class for AST nodes.
-    """
-    def children(self):
-        """ A sequence of all children that are Nodes
-        """
-        pass
-
-    def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):
-        """ Pretty print the Node and all its attributes and
-            children (recursively) to a buffer.
-            
-            buf:   
-                Open IO buffer into which the Node is printed.
-            
-            offset: 
-                Initial offset (amount of leading spaces) 
-            
-            attrnames:
-                True if you want to see the attribute names in
-                name=value pairs. False to only see the values.
-                
-            nodenames:
-                True if you want to see the actual node names 
-                within their parents.
-            
-            showcoord:
-                Do you want the coordinates of each Node to be
-                displayed.
-        """
-        lead = ' ' * offset
-        if nodenames and _my_node_name is not None:
-            buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')
-        else:
-            buf.write(lead + self.__class__.__name__+ ': ')
-
-        if self.attr_names:
-            if attrnames:
-                nvlist = [(n, getattr(self,n)) for n in self.attr_names]
-                attrstr = ', '.join('%s=%s' % nv for nv in nvlist)
-            else:
-                vlist = [getattr(self, n) for n in self.attr_names]
-                attrstr = ', '.join('%s' % v for v in vlist)
-            buf.write(attrstr)
-
-        if showcoord:
-            buf.write(' (at %s)' % self.coord)
-        buf.write('\n')
-
-        for (child_name, child) in self.children():
-            child.show(
-                buf,
-                offset=offset + 2,
-                attrnames=attrnames,
-                nodenames=nodenames,
-                showcoord=showcoord,
-                _my_node_name=child_name)
-
-
-class NodeVisitor(object):
-    """ A base NodeVisitor class for visiting c_ast nodes. 
-        Subclass it and define your own visit_XXX methods, where
-        XXX is the class name you want to visit with these 
-        methods.
-        
-        For example:
-        
-        class ConstantVisitor(NodeVisitor):
-            def __init__(self):
-                self.values = []
-            
-            def visit_Constant(self, node):
-                self.values.append(node.value)
-
-        Creates a list of values of all the constant nodes 
-        encountered below the given node. To use it:
-        
-        cv = ConstantVisitor()
-        cv.visit(node)
-        
-        Notes:
-        
-        *   generic_visit() will be called for AST nodes for which 
-            no visit_XXX method was defined. 
-        *   The children of nodes for which a visit_XXX was 
-            defined will not be visited - if you need this, call
-            generic_visit() on the node. 
-            You can use:
-                NodeVisitor.generic_visit(self, node)
-        *   Modeled after Python's own AST visiting facilities
-            (the ast module of Python 3.0)
-    """
-    def visit(self, node):
-        """ Visit a node. 
-        """
-        method = 'visit_' + node.__class__.__name__
-        visitor = getattr(self, method, self.generic_visit)
-        return visitor(node)
-        
-    def generic_visit(self, node):
-        """ Called if no explicit visitor function exists for a 
-            node. Implements preorder visiting of the node.
-        """
-        for c_name, c in node.children():
-            self.visit(c)
-
-
-'''
-
-
-if __name__ == "__main__":
-    import sys
-    ast_gen = ASTCodeGenerator('_c_ast.cfg')
-    ast_gen.generate(open('c_ast.py', 'w'))
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/_build_tables.py b/Linux_i686/lib/python3.4/site-packages/pycparser/_build_tables.py
deleted file mode 100644
index 7cb61ec..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/_build_tables.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#-----------------------------------------------------------------
-# pycparser: _build_tables.py
-#
-# A dummy for generating the lexing/parsing tables and and
-# compiling them into .pyc for faster execution in optimized mode.
-# Also generates AST code from the configuration file.
-# Should be called from the pycparser directory.
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-
-# Generate c_ast.py
-#
-from _ast_gen import ASTCodeGenerator
-ast_gen = ASTCodeGenerator('_c_ast.cfg')
-ast_gen.generate(open('c_ast.py', 'w'))
-
-import sys
-sys.path[0:0] = ['.', '..']
-from pycparser import c_parser
-
-# Generates the tables
-#
-c_parser.CParser(
-    lex_optimize=True,
-    yacc_debug=False,
-    yacc_optimize=True)
-
-# Load to compile into .pyc
-#
-import lextab
-import yacctab
-import c_ast
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/_c_ast.cfg b/Linux_i686/lib/python3.4/site-packages/pycparser/_c_ast.cfg
deleted file mode 100644
index 1c468a2..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/_c_ast.cfg
+++ /dev/null
@@ -1,188 +0,0 @@
-#-----------------------------------------------------------------
-# pycparser: _c_ast_gen.cfg
-#
-# Defines the AST Node classes used in pycparser.
-# 
-# Each entry is a Node sub-class name, listing the attributes
-# and child nodes of the class:
-#   *     - a child node
-#   **    - a sequence of child nodes
-#         - an attribute
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-
-ArrayDecl: [type*, dim*]
-
-ArrayRef: [name*, subscript*]
-
-# op: =, +=, /= etc.
-#
-Assignment: [op, lvalue*, rvalue*]
-
-BinaryOp: [op, left*, right*]
-
-Break: []
-
-Case: [expr*, stmts**]
-
-Cast: [to_type*, expr*]
-
-# Compound statement in C99 is a list of block items (declarations or
-# statements).
-#
-Compound: [block_items**]
-
-# Compound literal (anonymous aggregate) for C99.
-# (type-name) {initializer_list}
-# type: the typename
-# init: InitList for the initializer list
-#
-CompoundLiteral: [type*, init*]
-
-# type: int, char, float, etc. see CLexer for constant token types
-#
-Constant: [type, value]
-
-Continue: []
-
-# name: the variable being declared
-# quals: list of qualifiers (const, volatile)
-# funcspec: list function specifiers (i.e. inline in C99)
-# storage: list of storage specifiers (extern, register, etc.)
-# type: declaration type (probably nested with all the modifiers)
-# init: initialization value, or None
-# bitsize: bit field size, or None
-#
-Decl: [name, quals, storage, funcspec, type*, init*, bitsize*]
-
-DeclList: [decls**]
-
-Default: [stmts**]
-
-DoWhile: [cond*, stmt*]
-
-# Represents the ellipsis (...) parameter in a function 
-# declaration
-#
-EllipsisParam: []
-
-# An empty statement (a semicolon ';' on its own)
-#
-EmptyStatement: []
-
-# Enumeration type specifier
-# name: an optional ID
-# values: an EnumeratorList
-#
-Enum: [name, values*]
-
-# A name/value pair for enumeration values
-#
-Enumerator: [name, value*]
-
-# A list of enumerators
-#
-EnumeratorList: [enumerators**]
-
-# A list of expressions separated by the comma operator.
-#
-ExprList: [exprs**]
-
-# This is the top of the AST, representing a single C file (a 
-# translation unit in K&R jargon). It contains a list of 
-# "external-declaration"s, which is either declarations (Decl),
-# Typedef or function definitions (FuncDef).
-# 
-FileAST: [ext**]
-
-# for (init; cond; next) stmt
-#
-For: [init*, cond*, next*, stmt*]
-
-# name: Id
-# args: ExprList
-#
-FuncCall: [name*, args*]
-
-# type (args)
-#
-FuncDecl: [args*, type*]
-
-# Function definition: a declarator for the function name and
-# a body, which is a compound statement. 
-# There's an optional list of parameter declarations for old
-# K&R-style definitions
-#
-FuncDef: [decl*, param_decls**, body*]
-
-Goto: [name]
-
-ID: [name]
-
-# Holder for types that are a simple identifier (e.g. the built
-# ins void, char etc. and typedef-defined types)
-#
-IdentifierType: [names]
-
-If: [cond*, iftrue*, iffalse*]
-
-# An initialization list used for compound literals.
-#
-InitList: [exprs**]
-
-Label: [name, stmt*]
-
-# A named initializer for C99.
-# The name of a NamedInitializer is a sequence of Nodes, because
-# names can be hierarchical and contain constant expressions.
-#
-NamedInitializer: [name**, expr*]
-
-# a list of comma separated function parameter declarations
-#
-ParamList: [params**]
-
-PtrDecl: [quals, type*]
-
-Return: [expr*]
-
-# name: struct tag name
-# decls: declaration of members
-#
-Struct: [name, decls**]
-
-# type: . or ->
-# name.field or name->field
-#
-StructRef: [name*, type, field*]
-
-Switch: [cond*, stmt*]
-
-# cond ? iftrue : iffalse
-#
-TernaryOp: [cond*, iftrue*, iffalse*]
-
-# A base type declaration
-#
-TypeDecl: [declname, quals, type*]
-
-# A typedef declaration.
-# Very similar to Decl, but without some attributes
-#
-Typedef: [name, quals, storage, type*]
-
-Typename: [quals, type*]
-
-UnaryOp: [op, expr*]
-
-# name: union tag name
-# decls: declaration of members
-#
-Union: [name, decls**]
-
-While: [cond*, stmt*]
-
-
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/ast_transforms.py b/Linux_i686/lib/python3.4/site-packages/pycparser/ast_transforms.py
deleted file mode 100644
index b30ae3c..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/ast_transforms.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#------------------------------------------------------------------------------
-# pycparser: ast_transforms.py
-#
-# Some utilities used by the parser to create a friendlier AST.
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#------------------------------------------------------------------------------
-
-from . import c_ast
-
-
-def fix_switch_cases(switch_node):
-    """ The 'case' statements in a 'switch' come out of parsing with one
-        child node, so subsequent statements are just tucked to the parent
-        Compound. Additionally, consecutive (fall-through) case statements
-        come out messy. This is a peculiarity of the C grammar. The following:
-
-            switch (myvar) {
-                case 10:
-                    k = 10;
-                    p = k + 1;
-                    return 10;
-                case 20:
-                case 30:
-                    return 20;
-                default:
-                    break;
-            }
-
-        Creates this tree (pseudo-dump):
-
-            Switch
-                ID: myvar
-                Compound:
-                    Case 10:
-                        k = 10
-                    p = k + 1
-                    return 10
-                    Case 20:
-                        Case 30:
-                            return 20
-                    Default:
-                        break
-
-        The goal of this transform it to fix this mess, turning it into the
-        following:
-
-            Switch
-                ID: myvar
-                Compound:
-                    Case 10:
-                        k = 10
-                        p = k + 1
-                        return 10
-                    Case 20:
-                    Case 30:
-                        return 20
-                    Default:
-                        break
-
-        A fixed AST node is returned. The argument may be modified.
-    """
-    assert isinstance(switch_node, c_ast.Switch)
-    if not isinstance(switch_node.stmt, c_ast.Compound):
-        return switch_node
-
-    # The new Compound child for the Switch, which will collect children in the
-    # correct order
-    new_compound = c_ast.Compound([], switch_node.stmt.coord)
-
-    # The last Case/Default node
-    last_case = None
-
-    # Goes over the children of the Compound below the Switch, adding them
-    # either directly below new_compound or below the last Case as appropriate
-    for child in switch_node.stmt.block_items:
-        if isinstance(child, (c_ast.Case, c_ast.Default)):
-            # If it's a Case/Default:
-            # 1. Add it to the Compound and mark as "last case"
-            # 2. If its immediate child is also a Case or Default, promote it
-            #    to a sibling.
-            new_compound.block_items.append(child)
-            _extract_nested_case(child, new_compound.block_items)
-            last_case = new_compound.block_items[-1]
-        else:
-            # Other statements are added as childrent to the last case, if it
-            # exists.
-            if last_case is None:
-                new_compound.block_items.append(child)
-            else:
-                last_case.stmts.append(child)
-
-    switch_node.stmt = new_compound
-    return switch_node
-
-
-def _extract_nested_case(case_node, stmts_list):
-    """ Recursively extract consecutive Case statements that are made nested
-        by the parser and add them to the stmts_list.
-    """
-    if isinstance(case_node.stmts[0], (c_ast.Case, c_ast.Default)):
-        stmts_list.append(case_node.stmts.pop())
-        _extract_nested_case(stmts_list[-1], stmts_list)
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/c_ast.py b/Linux_i686/lib/python3.4/site-packages/pycparser/c_ast.py
deleted file mode 100644
index 2b9b00a..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/c_ast.py
+++ /dev/null
@@ -1,748 +0,0 @@
-#-----------------------------------------------------------------
-# ** ATTENTION **
-# This code was automatically generated from the file:
-# _c_ast.cfg 
-#
-# Do not modify it directly. Modify the configuration file and
-# run the generator again.
-# ** ** *** ** **
-#
-# pycparser: c_ast.py
-#
-# AST Node classes.
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-
-
-import sys
-
-
-class Node(object):
-    """ Abstract base class for AST nodes.
-    """
-    def children(self):
-        """ A sequence of all children that are Nodes
-        """
-        pass
-
-    def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):
-        """ Pretty print the Node and all its attributes and
-            children (recursively) to a buffer.
-            
-            buf:   
-                Open IO buffer into which the Node is printed.
-            
-            offset: 
-                Initial offset (amount of leading spaces) 
-            
-            attrnames:
-                True if you want to see the attribute names in
-                name=value pairs. False to only see the values.
-                
-            nodenames:
-                True if you want to see the actual node names 
-                within their parents.
-            
-            showcoord:
-                Do you want the coordinates of each Node to be
-                displayed.
-        """
-        lead = ' ' * offset
-        if nodenames and _my_node_name is not None:
-            buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')
-        else:
-            buf.write(lead + self.__class__.__name__+ ': ')
-
-        if self.attr_names:
-            if attrnames:
-                nvlist = [(n, getattr(self,n)) for n in self.attr_names]
-                attrstr = ', '.join('%s=%s' % nv for nv in nvlist)
-            else:
-                vlist = [getattr(self, n) for n in self.attr_names]
-                attrstr = ', '.join('%s' % v for v in vlist)
-            buf.write(attrstr)
-
-        if showcoord:
-            buf.write(' (at %s)' % self.coord)
-        buf.write('\n')
-
-        for (child_name, child) in self.children():
-            child.show(
-                buf,
-                offset=offset + 2,
-                attrnames=attrnames,
-                nodenames=nodenames,
-                showcoord=showcoord,
-                _my_node_name=child_name)
-
-
-class NodeVisitor(object):
-    """ A base NodeVisitor class for visiting c_ast nodes. 
-        Subclass it and define your own visit_XXX methods, where
-        XXX is the class name you want to visit with these 
-        methods.
-        
-        For example:
-        
-        class ConstantVisitor(NodeVisitor):
-            def __init__(self):
-                self.values = []
-            
-            def visit_Constant(self, node):
-                self.values.append(node.value)
-
-        Creates a list of values of all the constant nodes 
-        encountered below the given node. To use it:
-        
-        cv = ConstantVisitor()
-        cv.visit(node)
-        
-        Notes:
-        
-        *   generic_visit() will be called for AST nodes for which 
-            no visit_XXX method was defined. 
-        *   The children of nodes for which a visit_XXX was 
-            defined will not be visited - if you need this, call
-            generic_visit() on the node. 
-            You can use:
-                NodeVisitor.generic_visit(self, node)
-        *   Modeled after Python's own AST visiting facilities
-            (the ast module of Python 3.0)
-    """
-    def visit(self, node):
-        """ Visit a node. 
-        """
-        method = 'visit_' + node.__class__.__name__
-        visitor = getattr(self, method, self.generic_visit)
-        return visitor(node)
-        
-    def generic_visit(self, node):
-        """ Called if no explicit visitor function exists for a 
-            node. Implements preorder visiting of the node.
-        """
-        for c_name, c in node.children():
-            self.visit(c)
-
-
-class ArrayDecl(Node):
-    def __init__(self, type, dim, coord=None):
-        self.type = type
-        self.dim = dim
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        if self.dim is not None: nodelist.append(("dim", self.dim))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class ArrayRef(Node):
-    def __init__(self, name, subscript, coord=None):
-        self.name = name
-        self.subscript = subscript
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.name is not None: nodelist.append(("name", self.name))
-        if self.subscript is not None: nodelist.append(("subscript", self.subscript))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Assignment(Node):
-    def __init__(self, op, lvalue, rvalue, coord=None):
-        self.op = op
-        self.lvalue = lvalue
-        self.rvalue = rvalue
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.lvalue is not None: nodelist.append(("lvalue", self.lvalue))
-        if self.rvalue is not None: nodelist.append(("rvalue", self.rvalue))
-        return tuple(nodelist)
-
-    attr_names = ('op',)
-
-class BinaryOp(Node):
-    def __init__(self, op, left, right, coord=None):
-        self.op = op
-        self.left = left
-        self.right = right
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.left is not None: nodelist.append(("left", self.left))
-        if self.right is not None: nodelist.append(("right", self.right))
-        return tuple(nodelist)
-
-    attr_names = ('op',)
-
-class Break(Node):
-    def __init__(self, coord=None):
-        self.coord = coord
-
-    def children(self):
-        return ()
-
-    attr_names = ()
-
-class Case(Node):
-    def __init__(self, expr, stmts, coord=None):
-        self.expr = expr
-        self.stmts = stmts
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.expr is not None: nodelist.append(("expr", self.expr))
-        for i, child in enumerate(self.stmts or []):
-            nodelist.append(("stmts[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Cast(Node):
-    def __init__(self, to_type, expr, coord=None):
-        self.to_type = to_type
-        self.expr = expr
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.to_type is not None: nodelist.append(("to_type", self.to_type))
-        if self.expr is not None: nodelist.append(("expr", self.expr))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Compound(Node):
-    def __init__(self, block_items, coord=None):
-        self.block_items = block_items
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.block_items or []):
-            nodelist.append(("block_items[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class CompoundLiteral(Node):
-    def __init__(self, type, init, coord=None):
-        self.type = type
-        self.init = init
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        if self.init is not None: nodelist.append(("init", self.init))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Constant(Node):
-    def __init__(self, type, value, coord=None):
-        self.type = type
-        self.value = value
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        return tuple(nodelist)
-
-    attr_names = ('type','value',)
-
-class Continue(Node):
-    def __init__(self, coord=None):
-        self.coord = coord
-
-    def children(self):
-        return ()
-
-    attr_names = ()
-
-class Decl(Node):
-    def __init__(self, name, quals, storage, funcspec, type, init, bitsize, coord=None):
-        self.name = name
-        self.quals = quals
-        self.storage = storage
-        self.funcspec = funcspec
-        self.type = type
-        self.init = init
-        self.bitsize = bitsize
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        if self.init is not None: nodelist.append(("init", self.init))
-        if self.bitsize is not None: nodelist.append(("bitsize", self.bitsize))
-        return tuple(nodelist)
-
-    attr_names = ('name','quals','storage','funcspec',)
-
-class DeclList(Node):
-    def __init__(self, decls, coord=None):
-        self.decls = decls
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.decls or []):
-            nodelist.append(("decls[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Default(Node):
-    def __init__(self, stmts, coord=None):
-        self.stmts = stmts
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.stmts or []):
-            nodelist.append(("stmts[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class DoWhile(Node):
-    def __init__(self, cond, stmt, coord=None):
-        self.cond = cond
-        self.stmt = stmt
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.cond is not None: nodelist.append(("cond", self.cond))
-        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class EllipsisParam(Node):
-    def __init__(self, coord=None):
-        self.coord = coord
-
-    def children(self):
-        return ()
-
-    attr_names = ()
-
-class EmptyStatement(Node):
-    def __init__(self, coord=None):
-        self.coord = coord
-
-    def children(self):
-        return ()
-
-    attr_names = ()
-
-class Enum(Node):
-    def __init__(self, name, values, coord=None):
-        self.name = name
-        self.values = values
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.values is not None: nodelist.append(("values", self.values))
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class Enumerator(Node):
-    def __init__(self, name, value, coord=None):
-        self.name = name
-        self.value = value
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.value is not None: nodelist.append(("value", self.value))
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class EnumeratorList(Node):
-    def __init__(self, enumerators, coord=None):
-        self.enumerators = enumerators
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.enumerators or []):
-            nodelist.append(("enumerators[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class ExprList(Node):
-    def __init__(self, exprs, coord=None):
-        self.exprs = exprs
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.exprs or []):
-            nodelist.append(("exprs[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class FileAST(Node):
-    def __init__(self, ext, coord=None):
-        self.ext = ext
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.ext or []):
-            nodelist.append(("ext[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class For(Node):
-    def __init__(self, init, cond, next, stmt, coord=None):
-        self.init = init
-        self.cond = cond
-        self.next = next
-        self.stmt = stmt
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.init is not None: nodelist.append(("init", self.init))
-        if self.cond is not None: nodelist.append(("cond", self.cond))
-        if self.next is not None: nodelist.append(("next", self.next))
-        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class FuncCall(Node):
-    def __init__(self, name, args, coord=None):
-        self.name = name
-        self.args = args
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.name is not None: nodelist.append(("name", self.name))
-        if self.args is not None: nodelist.append(("args", self.args))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class FuncDecl(Node):
-    def __init__(self, args, type, coord=None):
-        self.args = args
-        self.type = type
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.args is not None: nodelist.append(("args", self.args))
-        if self.type is not None: nodelist.append(("type", self.type))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class FuncDef(Node):
-    def __init__(self, decl, param_decls, body, coord=None):
-        self.decl = decl
-        self.param_decls = param_decls
-        self.body = body
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.decl is not None: nodelist.append(("decl", self.decl))
-        if self.body is not None: nodelist.append(("body", self.body))
-        for i, child in enumerate(self.param_decls or []):
-            nodelist.append(("param_decls[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Goto(Node):
-    def __init__(self, name, coord=None):
-        self.name = name
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class ID(Node):
-    def __init__(self, name, coord=None):
-        self.name = name
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class IdentifierType(Node):
-    def __init__(self, names, coord=None):
-        self.names = names
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        return tuple(nodelist)
-
-    attr_names = ('names',)
-
-class If(Node):
-    def __init__(self, cond, iftrue, iffalse, coord=None):
-        self.cond = cond
-        self.iftrue = iftrue
-        self.iffalse = iffalse
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.cond is not None: nodelist.append(("cond", self.cond))
-        if self.iftrue is not None: nodelist.append(("iftrue", self.iftrue))
-        if self.iffalse is not None: nodelist.append(("iffalse", self.iffalse))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class InitList(Node):
-    def __init__(self, exprs, coord=None):
-        self.exprs = exprs
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.exprs or []):
-            nodelist.append(("exprs[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Label(Node):
-    def __init__(self, name, stmt, coord=None):
-        self.name = name
-        self.stmt = stmt
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class NamedInitializer(Node):
-    def __init__(self, name, expr, coord=None):
-        self.name = name
-        self.expr = expr
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.expr is not None: nodelist.append(("expr", self.expr))
-        for i, child in enumerate(self.name or []):
-            nodelist.append(("name[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class ParamList(Node):
-    def __init__(self, params, coord=None):
-        self.params = params
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.params or []):
-            nodelist.append(("params[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class PtrDecl(Node):
-    def __init__(self, quals, type, coord=None):
-        self.quals = quals
-        self.type = type
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        return tuple(nodelist)
-
-    attr_names = ('quals',)
-
-class Return(Node):
-    def __init__(self, expr, coord=None):
-        self.expr = expr
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.expr is not None: nodelist.append(("expr", self.expr))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class Struct(Node):
-    def __init__(self, name, decls, coord=None):
-        self.name = name
-        self.decls = decls
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.decls or []):
-            nodelist.append(("decls[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class StructRef(Node):
-    def __init__(self, name, type, field, coord=None):
-        self.name = name
-        self.type = type
-        self.field = field
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.name is not None: nodelist.append(("name", self.name))
-        if self.field is not None: nodelist.append(("field", self.field))
-        return tuple(nodelist)
-
-    attr_names = ('type',)
-
-class Switch(Node):
-    def __init__(self, cond, stmt, coord=None):
-        self.cond = cond
-        self.stmt = stmt
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.cond is not None: nodelist.append(("cond", self.cond))
-        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class TernaryOp(Node):
-    def __init__(self, cond, iftrue, iffalse, coord=None):
-        self.cond = cond
-        self.iftrue = iftrue
-        self.iffalse = iffalse
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.cond is not None: nodelist.append(("cond", self.cond))
-        if self.iftrue is not None: nodelist.append(("iftrue", self.iftrue))
-        if self.iffalse is not None: nodelist.append(("iffalse", self.iffalse))
-        return tuple(nodelist)
-
-    attr_names = ()
-
-class TypeDecl(Node):
-    def __init__(self, declname, quals, type, coord=None):
-        self.declname = declname
-        self.quals = quals
-        self.type = type
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        return tuple(nodelist)
-
-    attr_names = ('declname','quals',)
-
-class Typedef(Node):
-    def __init__(self, name, quals, storage, type, coord=None):
-        self.name = name
-        self.quals = quals
-        self.storage = storage
-        self.type = type
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        return tuple(nodelist)
-
-    attr_names = ('name','quals','storage',)
-
-class Typename(Node):
-    def __init__(self, quals, type, coord=None):
-        self.quals = quals
-        self.type = type
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.type is not None: nodelist.append(("type", self.type))
-        return tuple(nodelist)
-
-    attr_names = ('quals',)
-
-class UnaryOp(Node):
-    def __init__(self, op, expr, coord=None):
-        self.op = op
-        self.expr = expr
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.expr is not None: nodelist.append(("expr", self.expr))
-        return tuple(nodelist)
-
-    attr_names = ('op',)
-
-class Union(Node):
-    def __init__(self, name, decls, coord=None):
-        self.name = name
-        self.decls = decls
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        for i, child in enumerate(self.decls or []):
-            nodelist.append(("decls[%d]" % i, child))
-        return tuple(nodelist)
-
-    attr_names = ('name',)
-
-class While(Node):
-    def __init__(self, cond, stmt, coord=None):
-        self.cond = cond
-        self.stmt = stmt
-        self.coord = coord
-
-    def children(self):
-        nodelist = []
-        if self.cond is not None: nodelist.append(("cond", self.cond))
-        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
-        return tuple(nodelist)
-
-    attr_names = ()
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/c_generator.py b/Linux_i686/lib/python3.4/site-packages/pycparser/c_generator.py
deleted file mode 100644
index 3f49e68..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/c_generator.py
+++ /dev/null
@@ -1,405 +0,0 @@
-#------------------------------------------------------------------------------
-# pycparser: c_generator.py
-#
-# C code generator from pycparser AST nodes.
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#------------------------------------------------------------------------------
-from . import c_ast
-
-
-class CGenerator(object):
-    """ Uses the same visitor pattern as c_ast.NodeVisitor, but modified to
-        return a value from each visit method, using string accumulation in
-        generic_visit.
-    """
-    def __init__(self):
-        self.output = ''
-
-        # Statements start with indentation of self.indent_level spaces, using
-        # the _make_indent method
-        #
-        self.indent_level = 0
-
-    def _make_indent(self):
-        return ' ' * self.indent_level
-
-    def visit(self, node):
-        method = 'visit_' + node.__class__.__name__
-        return getattr(self, method, self.generic_visit)(node)
-
-    def generic_visit(self, node):
-        #~ print('generic:', type(node))
-        if node is None:
-            return ''
-        else:
-            return ''.join(self.visit(c) for c in node.children())
-
-    def visit_Constant(self, n):
-        return n.value
-
-    def visit_ID(self, n):
-        return n.name
-
-    def visit_ArrayRef(self, n):
-        arrref = self._parenthesize_unless_simple(n.name)
-        return arrref + '[' + self.visit(n.subscript) + ']'
-
-    def visit_StructRef(self, n):
-        sref = self._parenthesize_unless_simple(n.name)
-        return sref + n.type + self.visit(n.field)
-
-    def visit_FuncCall(self, n):
-        fref = self._parenthesize_unless_simple(n.name)
-        return fref + '(' + self.visit(n.args) + ')'
-
-    def visit_UnaryOp(self, n):
-        operand = self._parenthesize_unless_simple(n.expr)
-        if n.op == 'p++':
-            return '%s++' % operand
-        elif n.op == 'p--':
-            return '%s--' % operand
-        elif n.op == 'sizeof':
-            # Always parenthesize the argument of sizeof since it can be
-            # a name.
-            return 'sizeof(%s)' % self.visit(n.expr)
-        else:
-            return '%s%s' % (n.op, operand)
-
-    def visit_BinaryOp(self, n):
-        lval_str = self._parenthesize_if(n.left,
-                            lambda d: not self._is_simple_node(d))
-        rval_str = self._parenthesize_if(n.right,
-                            lambda d: not self._is_simple_node(d))
-        return '%s %s %s' % (lval_str, n.op, rval_str)
-
-    def visit_Assignment(self, n):
-        rval_str = self._parenthesize_if(
-                            n.rvalue,
-                            lambda n: isinstance(n, c_ast.Assignment))
-        return '%s %s %s' % (self.visit(n.lvalue), n.op, rval_str)
-
-    def visit_IdentifierType(self, n):
-        return ' '.join(n.names)
-
-    def visit_Decl(self, n, no_type=False):
-        # no_type is used when a Decl is part of a DeclList, where the type is
-        # explicitly only for the first delaration in a list.
-        #
-        s = n.name if no_type else self._generate_decl(n)
-        if n.bitsize: s += ' : ' + self.visit(n.bitsize)
-        if n.init:
-            if isinstance(n.init, c_ast.InitList):
-                s += ' = {' + self.visit(n.init) + '}'
-            elif isinstance(n.init, c_ast.ExprList):
-                s += ' = (' + self.visit(n.init) + ')'
-            else:
-                s += ' = ' + self.visit(n.init)
-        return s
-
-    def visit_DeclList(self, n):
-        s = self.visit(n.decls[0])
-        if len(n.decls) > 1:
-            s += ', ' + ', '.join(self.visit_Decl(decl, no_type=True)
-                                    for decl in n.decls[1:])
-        return s
-
-    def visit_Typedef(self, n):
-        s = ''
-        if n.storage: s += ' '.join(n.storage) + ' '
-        s += self._generate_type(n.type)
-        return s
-
-    def visit_Cast(self, n):
-        s = '(' + self._generate_type(n.to_type) + ')'
-        return s + ' ' + self._parenthesize_unless_simple(n.expr)
-
-    def visit_ExprList(self, n):
-        visited_subexprs = []
-        for expr in n.exprs:
-            if isinstance(expr, c_ast.ExprList):
-                visited_subexprs.append('{' + self.visit(expr) + '}')
-            else:
-                visited_subexprs.append(self.visit(expr))
-        return ', '.join(visited_subexprs)
-
-    def visit_InitList(self, n):
-        visited_subexprs = []
-        for expr in n.exprs:
-            if isinstance(expr, c_ast.ExprList):
-                visited_subexprs.append('(' + self.visit(expr) + ')')
-            elif isinstance(expr, c_ast.InitList):
-                visited_subexprs.append('{' + self.visit(expr) + '}')
-            else:
-                visited_subexprs.append(self.visit(expr))
-        return ', '.join(visited_subexprs)
-
-    def visit_Enum(self, n):
-        s = 'enum'
-        if n.name: s += ' ' + n.name
-        if n.values:
-            s += ' {'
-            for i, enumerator in enumerate(n.values.enumerators):
-                s += enumerator.name
-                if enumerator.value:
-                    s += ' = ' + self.visit(enumerator.value)
-                if i != len(n.values.enumerators) - 1:
-                    s += ', '
-            s += '}'
-        return s
-
-    def visit_FuncDef(self, n):
-        decl = self.visit(n.decl)
-        self.indent_level = 0
-        body = self.visit(n.body)
-        if n.param_decls:
-            knrdecls = ';\n'.join(self.visit(p) for p in n.param_decls)
-            return decl + '\n' + knrdecls + ';\n' + body + '\n'
-        else:
-            return decl + '\n' + body + '\n'
-
-    def visit_FileAST(self, n):
-        s = ''
-        for ext in n.ext:
-            if isinstance(ext, c_ast.FuncDef):
-                s += self.visit(ext)
-            else:
-                s += self.visit(ext) + ';\n'
-        return s
-
-    def visit_Compound(self, n):
-        s = self._make_indent() + '{\n'
-        self.indent_level += 2
-        if n.block_items:
-            s += ''.join(self._generate_stmt(stmt) for stmt in n.block_items)
-        self.indent_level -= 2
-        s += self._make_indent() + '}\n'
-        return s
-
-    def visit_EmptyStatement(self, n):
-        return ';'
-
-    def visit_ParamList(self, n):
-        return ', '.join(self.visit(param) for param in n.params)
-
-    def visit_Return(self, n):
-        s = 'return'
-        if n.expr: s += ' ' + self.visit(n.expr)
-        return s + ';'
-
-    def visit_Break(self, n):
-        return 'break;'
-
-    def visit_Continue(self, n):
-        return 'continue;'
-
-    def visit_TernaryOp(self, n):
-        s = self.visit(n.cond) + ' ? '
-        s += self.visit(n.iftrue) + ' : '
-        s += self.visit(n.iffalse)
-        return s
-
-    def visit_If(self, n):
-        s = 'if ('
-        if n.cond: s += self.visit(n.cond)
-        s += ')\n'
-        s += self._generate_stmt(n.iftrue, add_indent=True)
-        if n.iffalse:
-            s += self._make_indent() + 'else\n'
-            s += self._generate_stmt(n.iffalse, add_indent=True)
-        return s
-
-    def visit_For(self, n):
-        s = 'for ('
-        if n.init: s += self.visit(n.init)
-        s += ';'
-        if n.cond: s += ' ' + self.visit(n.cond)
-        s += ';'
-        if n.next: s += ' ' + self.visit(n.next)
-        s += ')\n'
-        s += self._generate_stmt(n.stmt, add_indent=True)
-        return s
-
-    def visit_While(self, n):
-        s = 'while ('
-        if n.cond: s += self.visit(n.cond)
-        s += ')\n'
-        s += self._generate_stmt(n.stmt, add_indent=True)
-        return s
-
-    def visit_DoWhile(self, n):
-        s = 'do\n'
-        s += self._generate_stmt(n.stmt, add_indent=True)
-        s += self._make_indent() + 'while ('
-        if n.cond: s += self.visit(n.cond)
-        s += ');'
-        return s
-
-    def visit_Switch(self, n):
-        s = 'switch (' + self.visit(n.cond) + ')\n'
-        s += self._generate_stmt(n.stmt, add_indent=True)
-        return s
-
-    def visit_Case(self, n):
-        s = 'case ' + self.visit(n.expr) + ':\n'
-        for stmt in n.stmts:
-            s += self._generate_stmt(stmt, add_indent=True)
-        return s
-
-    def visit_Default(self, n):
-        s = 'default:\n'
-        for stmt in n.stmts:
-            s += self._generate_stmt(stmt, add_indent=True)
-        return s
-
-    def visit_Label(self, n):
-        return n.name + ':\n' + self._generate_stmt(n.stmt)
-
-    def visit_Goto(self, n):
-        return 'goto ' + n.name + ';'
-
-    def visit_EllipsisParam(self, n):
-        return '...'
-
-    def visit_Struct(self, n):
-        return self._generate_struct_union(n, 'struct')
-
-    def visit_Typename(self, n):
-        return self._generate_type(n.type)
-
-    def visit_Union(self, n):
-        return self._generate_struct_union(n, 'union')
-
-    def visit_NamedInitializer(self, n):
-        s = ''
-        for name in n.name:
-            if isinstance(name, c_ast.ID):
-                s += '.' + name.name
-            elif isinstance(name, c_ast.Constant):
-                s += '[' + name.value + ']'
-        s += ' = ' + self.visit(n.expr)
-        return s
-
-    def _generate_struct_union(self, n, name):
-        """ Generates code for structs and unions. name should be either
-            'struct' or union.
-        """
-        s = name + ' ' + (n.name or '')
-        if n.decls:
-            s += '\n'
-            s += self._make_indent()
-            self.indent_level += 2
-            s += '{\n'
-            for decl in n.decls:
-                s += self._generate_stmt(decl)
-            self.indent_level -= 2
-            s += self._make_indent() + '}'
-        return s
-
-    def _generate_stmt(self, n, add_indent=False):
-        """ Generation from a statement node. This method exists as a wrapper
-            for individual visit_* methods to handle different treatment of
-            some statements in this context.
-        """
-        typ = type(n)
-        if add_indent: self.indent_level += 2
-        indent = self._make_indent()
-        if add_indent: self.indent_level -= 2
-
-        if typ in (
-                c_ast.Decl, c_ast.Assignment, c_ast.Cast, c_ast.UnaryOp,
-                c_ast.BinaryOp, c_ast.TernaryOp, c_ast.FuncCall, c_ast.ArrayRef,
-                c_ast.StructRef, c_ast.Constant, c_ast.ID, c_ast.Typedef,
-                c_ast.ExprList):
-            # These can also appear in an expression context so no semicolon
-            # is added to them automatically
-            #
-            return indent + self.visit(n) + ';\n'
-        elif typ in (c_ast.Compound,):
-            # No extra indentation required before the opening brace of a
-            # compound - because it consists of multiple lines it has to
-            # compute its own indentation.
-            #
-            return self.visit(n)
-        else:
-            return indent + self.visit(n) + '\n'
-
-    def _generate_decl(self, n):
-        """ Generation from a Decl node.
-        """
-        s = ''
-        if n.funcspec: s = ' '.join(n.funcspec) + ' '
-        if n.storage: s += ' '.join(n.storage) + ' '
-        s += self._generate_type(n.type)
-        return s
-
-    def _generate_type(self, n, modifiers=[]):
-        """ Recursive generation from a type node. n is the type node.
-            modifiers collects the PtrDecl, ArrayDecl and FuncDecl modifiers
-            encountered on the way down to a TypeDecl, to allow proper
-            generation from it.
-        """
-        typ = type(n)
-        #~ print(n, modifiers)
-
-        if typ == c_ast.TypeDecl:
-            s = ''
-            if n.quals: s += ' '.join(n.quals) + ' '
-            s += self.visit(n.type)
-
-            nstr = n.declname if n.declname else ''
-            # Resolve modifiers.
-            # Wrap in parens to distinguish pointer to array and pointer to
-            # function syntax.
-            #
-            for i, modifier in enumerate(modifiers):
-                if isinstance(modifier, c_ast.ArrayDecl):
-                    if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)):
-                        nstr = '(' + nstr + ')'
-                    nstr += '[' + self.visit(modifier.dim) + ']'
-                elif isinstance(modifier, c_ast.FuncDecl):
-                    if (i != 0 and isinstance(modifiers[i - 1], c_ast.PtrDecl)):
-                        nstr = '(' + nstr + ')'
-                    nstr += '(' + self.visit(modifier.args) + ')'
-                elif isinstance(modifier, c_ast.PtrDecl):
-                    if modifier.quals:
-                        nstr = '* %s %s' % (' '.join(modifier.quals), nstr)
-                    else:
-                        nstr = '*' + nstr
-            if nstr: s += ' ' + nstr
-            return s
-        elif typ == c_ast.Decl:
-            return self._generate_decl(n.type)
-        elif typ == c_ast.Typename:
-            return self._generate_type(n.type)
-        elif typ == c_ast.IdentifierType:
-            return ' '.join(n.names) + ' '
-        elif typ in (c_ast.ArrayDecl, c_ast.PtrDecl, c_ast.FuncDecl):
-            return self._generate_type(n.type, modifiers + [n])
-        else:
-            return self.visit(n)
-
-    def _parenthesize_if(self, n, condition):
-        """ Visits 'n' and returns its string representation, parenthesized
-            if the condition function applied to the node returns True.
-        """
-        s = self.visit(n)
-        if condition(n):
-            return '(' + s + ')'
-        else:
-            return s
-
-    def _parenthesize_unless_simple(self, n):
-        """ Common use case for _parenthesize_if
-        """
-        return self._parenthesize_if(n, lambda d: not self._is_simple_node(d))
-
-    def _is_simple_node(self, n):
-        """ Returns True for nodes that are "simple" - i.e. nodes that always
-            have higher precedence than operators.
-        """
-        return isinstance(n,(   c_ast.Constant, c_ast.ID, c_ast.ArrayRef,
-                                c_ast.StructRef, c_ast.FuncCall))
-
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/c_lexer.py b/Linux_i686/lib/python3.4/site-packages/pycparser/c_lexer.py
deleted file mode 100644
index 393f0a8..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/c_lexer.py
+++ /dev/null
@@ -1,477 +0,0 @@
-#------------------------------------------------------------------------------
-# pycparser: c_lexer.py
-#
-# CLexer class: lexer for the C language
-#
-# Copyright (C) 2008-2013, Eli Bendersky
-# License: BSD
-#------------------------------------------------------------------------------
-import re
-import sys
-
-from .ply import lex
-from .ply.lex import TOKEN
-
-
-class CLexer(object):
-    """ A lexer for the C language. After building it, set the
-        input text with input(), and call token() to get new
-        tokens.
-
-        The public attribute filename can be set to an initial
-        filaneme, but the lexer will update it upon #line
-        directives.
-    """
-    def __init__(self, error_func, on_lbrace_func, on_rbrace_func,
-                 type_lookup_func):
-        """ Create a new Lexer.
-
-            error_func:
-                An error function. Will be called with an error
-                message, line and column as arguments, in case of
-                an error during lexing.
-
-            on_lbrace_func, on_rbrace_func:
-                Called when an LBRACE or RBRACE is encountered
-                (likely to push/pop type_lookup_func's scope)
-
-            type_lookup_func:
-                A type lookup function. Given a string, it must
-                return True IFF this string is a name of a type
-                that was defined with a typedef earlier.
-        """
-        self.error_func = error_func
-        self.on_lbrace_func = on_lbrace_func
-        self.on_rbrace_func = on_rbrace_func
-        self.type_lookup_func = type_lookup_func
-        self.filename = ''
-
-        # Keeps track of the last token returned from self.token()
-        self.last_token = None
-
-        # Allow either "# line" or "# " to support GCC's
-        # cpp output
-        #
-        self.line_pattern = re.compile('([ \t]*line\W)|([ \t]*\d+)')
-        self.pragma_pattern = re.compile('[ \t]*pragma\W')
-
-    def build(self, **kwargs):
-        """ Builds the lexer from the specification. Must be
-            called after the lexer object is created.
-
-            This method exists separately, because the PLY
-            manual warns against calling lex.lex inside
-            __init__
-        """
-        self.lexer = lex.lex(object=self, **kwargs)
-
-    def reset_lineno(self):
-        """ Resets the internal line number counter of the lexer.
-        """
-        self.lexer.lineno = 1
-
-    def input(self, text):
-        self.lexer.input(text)
-
-    def token(self):
-        self.last_token = self.lexer.token()
-        return self.last_token
-
-    def find_tok_column(self, token):
-        """ Find the column of the token in its line.
-        """
-        last_cr = self.lexer.lexdata.rfind('\n', 0, token.lexpos)
-        return token.lexpos - last_cr
-
-    ######################--   PRIVATE   --######################
-
-    ##
-    ## Internal auxiliary methods
-    ##
-    def _error(self, msg, token):
-        location = self._make_tok_location(token)
-        self.error_func(msg, location[0], location[1])
-        self.lexer.skip(1)
-
-    def _make_tok_location(self, token):
-        return (token.lineno, self.find_tok_column(token))
-
-    ##
-    ## Reserved keywords
-    ##
-    keywords = (
-        '_BOOL', '_COMPLEX', 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST',
-        'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', 'ELSE', 'ENUM', 'EXTERN',
-        'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG', 'REGISTER',
-        'RESTRICT', 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT',
-        'SWITCH', 'TYPEDEF', 'UNION', 'UNSIGNED', 'VOID',
-        'VOLATILE', 'WHILE',
-    )
-
-    keyword_map = {}
-    for keyword in keywords:
-        if keyword == '_BOOL':
-            keyword_map['_Bool'] = keyword
-        elif keyword == '_COMPLEX':
-            keyword_map['_Complex'] = keyword
-        else:
-            keyword_map[keyword.lower()] = keyword
-
-    ##
-    ## All the tokens recognized by the lexer
-    ##
-    tokens = keywords + (
-        # Identifiers
-        'ID',
-
-        # Type identifiers (identifiers previously defined as
-        # types with typedef)
-        'TYPEID',
-
-        # constants
-        'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX',
-        'FLOAT_CONST', 'HEX_FLOAT_CONST',
-        'CHAR_CONST',
-        'WCHAR_CONST',
-
-        # String literals
-        'STRING_LITERAL',
-        'WSTRING_LITERAL',
-
-        # Operators
-        'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD',
-        'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT',
-        'LOR', 'LAND', 'LNOT',
-        'LT', 'LE', 'GT', 'GE', 'EQ', 'NE',
-
-        # Assignment
-        'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL',
-        'PLUSEQUAL', 'MINUSEQUAL',
-        'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL',
-        'OREQUAL',
-
-        # Increment/decrement
-        'PLUSPLUS', 'MINUSMINUS',
-
-        # Structure dereference (->)
-        'ARROW',
-
-        # Conditional operator (?)
-        'CONDOP',
-
-        # Delimeters
-        'LPAREN', 'RPAREN',         # ( )
-        'LBRACKET', 'RBRACKET',     # [ ]
-        'LBRACE', 'RBRACE',         # { }
-        'COMMA', 'PERIOD',          # . ,
-        'SEMI', 'COLON',            # ; :
-
-        # Ellipsis (...)
-        'ELLIPSIS',
-
-        # pre-processor
-        'PPHASH',      # '#'
-    )
-
-    ##
-    ## Regexes for use in tokens
-    ##
-    ##
-
-    # valid C identifiers (K&R2: A.2.3), plus '$' (supported by some compilers)
-    identifier = r'[a-zA-Z_$][0-9a-zA-Z_$]*'
-
-    hex_prefix = '0[xX]'
-    hex_digits = '[0-9a-fA-F]+'
-
-    # integer constants (K&R2: A.2.5.1)
-    integer_suffix_opt = r'(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?'
-    decimal_constant = '(0'+integer_suffix_opt+')|([1-9][0-9]*'+integer_suffix_opt+')'
-    octal_constant = '0[0-7]*'+integer_suffix_opt
-    hex_constant = hex_prefix+hex_digits+integer_suffix_opt
-
-    bad_octal_constant = '0[0-7]*[89]'
-
-    # character constants (K&R2: A.2.5.2)
-    # Note: a-zA-Z and '.-~^_!=&;,' are allowed as escape chars to support #line
-    # directives with Windows paths as filenames (..\..\dir\file)
-    # For the same reason, decimal_escape allows all digit sequences. We want to
-    # parse all correct code, even if it means to sometimes parse incorrect
-    # code.
-    #
-    simple_escape = r"""([a-zA-Z._~!=&\^\-\\?'"])"""
-    decimal_escape = r"""(\d+)"""
-    hex_escape = r"""(x[0-9a-fA-F]+)"""
-    bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-7])"""
-
-    escape_sequence = r"""(\\("""+simple_escape+'|'+decimal_escape+'|'+hex_escape+'))'
-    cconst_char = r"""([^'\\\n]|"""+escape_sequence+')'
-    char_const = "'"+cconst_char+"'"
-    wchar_const = 'L'+char_const
-    unmatched_quote = "('"+cconst_char+"*\\n)|('"+cconst_char+"*$)"
-    bad_char_const = r"""('"""+cconst_char+"""[^'\n]+')|('')|('"""+bad_escape+r"""[^'\n]*')"""
-
-    # string literals (K&R2: A.2.6)
-    string_char = r"""([^"\\\n]|"""+escape_sequence+')'
-    string_literal = '"'+string_char+'*"'
-    wstring_literal = 'L'+string_literal
-    bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"'
-
-    # floating constants (K&R2: A.2.5.3)
-    exponent_part = r"""([eE][-+]?[0-9]+)"""
-    fractional_constant = r"""([0-9]*\.[0-9]+)|([0-9]+\.)"""
-    floating_constant = '(((('+fractional_constant+')'+exponent_part+'?)|([0-9]+'+exponent_part+'))[FfLl]?)'
-    binary_exponent_part = r'''([pP][+-]?[0-9]+)'''
-    hex_fractional_constant = '((('+hex_digits+r""")?\."""+hex_digits+')|('+hex_digits+r"""\.))"""
-    hex_floating_constant = '('+hex_prefix+'('+hex_digits+'|'+hex_fractional_constant+')'+binary_exponent_part+'[FfLl]?)'
-
-    ##
-    ## Lexer states: used for preprocessor \n-terminated directives
-    ##
-    states = (
-        # ppline: preprocessor line directives
-        #
-        ('ppline', 'exclusive'),
-
-        # pppragma: pragma
-        #
-        ('pppragma', 'exclusive'),
-    )
-
-    def t_PPHASH(self, t):
-        r'[ \t]*\#'
-        if self.line_pattern.match(t.lexer.lexdata, pos=t.lexer.lexpos):
-            t.lexer.begin('ppline')
-            self.pp_line = self.pp_filename = None
-        elif self.pragma_pattern.match(t.lexer.lexdata, pos=t.lexer.lexpos):
-            t.lexer.begin('pppragma')
-        else:
-            t.type = 'PPHASH'
-            return t
-
-    ##
-    ## Rules for the ppline state
-    ##
-    @TOKEN(string_literal)
-    def t_ppline_FILENAME(self, t):
-        if self.pp_line is None:
-            self._error('filename before line number in #line', t)
-        else:
-            self.pp_filename = t.value.lstrip('"').rstrip('"')
-
-    @TOKEN(decimal_constant)
-    def t_ppline_LINE_NUMBER(self, t):
-        if self.pp_line is None:
-            self.pp_line = t.value
-        else:
-            # Ignore: GCC's cpp sometimes inserts a numeric flag
-            # after the file name
-            pass
-
-    def t_ppline_NEWLINE(self, t):
-        r'\n'
-
-        if self.pp_line is None:
-            self._error('line number missing in #line', t)
-        else:
-            self.lexer.lineno = int(self.pp_line)
-
-            if self.pp_filename is not None:
-                self.filename = self.pp_filename
-
-        t.lexer.begin('INITIAL')
-
-    def t_ppline_PPLINE(self, t):
-        r'line'
-        pass
-
-    t_ppline_ignore = ' \t'
-
-    def t_ppline_error(self, t):
-        self._error('invalid #line directive', t)
-
-    ##
-    ## Rules for the pppragma state
-    ##
-    def t_pppragma_NEWLINE(self, t):
-        r'\n'
-        t.lexer.lineno += 1
-        t.lexer.begin('INITIAL')
-
-    def t_pppragma_PPPRAGMA(self, t):
-        r'pragma'
-        pass
-
-    t_pppragma_ignore = ' \t<>.-{}();+-*/$%@&^~!?:,0123456789'
-
-    @TOKEN(string_literal)
-    def t_pppragma_STR(self, t): pass
-
-    @TOKEN(identifier)
-    def t_pppragma_ID(self, t): pass
-
-    def t_pppragma_error(self, t):
-        self._error('invalid #pragma directive', t)
-
-    ##
-    ## Rules for the normal state
-    ##
-    t_ignore = ' \t'
-
-    # Newlines
-    def t_NEWLINE(self, t):
-        r'\n+'
-        t.lexer.lineno += t.value.count("\n")
-
-    # Operators
-    t_PLUS              = r'\+'
-    t_MINUS             = r'-'
-    t_TIMES             = r'\*'
-    t_DIVIDE            = r'/'
-    t_MOD               = r'%'
-    t_OR                = r'\|'
-    t_AND               = r'&'
-    t_NOT               = r'~'
-    t_XOR               = r'\^'
-    t_LSHIFT            = r'<<'
-    t_RSHIFT            = r'>>'
-    t_LOR               = r'\|\|'
-    t_LAND              = r'&&'
-    t_LNOT              = r'!'
-    t_LT                = r'<'
-    t_GT                = r'>'
-    t_LE                = r'<='
-    t_GE                = r'>='
-    t_EQ                = r'=='
-    t_NE                = r'!='
-
-    # Assignment operators
-    t_EQUALS            = r'='
-    t_TIMESEQUAL        = r'\*='
-    t_DIVEQUAL          = r'/='
-    t_MODEQUAL          = r'%='
-    t_PLUSEQUAL         = r'\+='
-    t_MINUSEQUAL        = r'-='
-    t_LSHIFTEQUAL       = r'<<='
-    t_RSHIFTEQUAL       = r'>>='
-    t_ANDEQUAL          = r'&='
-    t_OREQUAL           = r'\|='
-    t_XOREQUAL          = r'\^='
-
-    # Increment/decrement
-    t_PLUSPLUS          = r'\+\+'
-    t_MINUSMINUS        = r'--'
-
-    # ->
-    t_ARROW             = r'->'
-
-    # ?
-    t_CONDOP            = r'\?'
-
-    # Delimeters
-    t_LPAREN            = r'\('
-    t_RPAREN            = r'\)'
-    t_LBRACKET          = r'\['
-    t_RBRACKET          = r'\]'
-    t_COMMA             = r','
-    t_PERIOD            = r'\.'
-    t_SEMI              = r';'
-    t_COLON             = r':'
-    t_ELLIPSIS          = r'\.\.\.'
-
-    # Scope delimiters
-    # To see why on_lbrace_func is needed, consider:
-    #   typedef char TT;
-    #   void foo(int TT) { TT = 10; }
-    #   TT x = 5;
-    # Outside the function, TT is a typedef, but inside (starting and ending
-    # with the braces) it's a parameter.  The trouble begins with yacc's
-    # lookahead token.  If we open a new scope in brace_open, then TT has
-    # already been read and incorrectly interpreted as TYPEID.  So, we need
-    # to open and close scopes from within the lexer.
-    # Similar for the TT immediately outside the end of the function.
-    #
-    @TOKEN(r'\{')
-    def t_LBRACE(self, t):
-        self.on_lbrace_func()
-        return t
-    @TOKEN(r'\}')
-    def t_RBRACE(self, t):
-        self.on_rbrace_func()
-        return t
-
-    t_STRING_LITERAL = string_literal
-
-    # The following floating and integer constants are defined as
-    # functions to impose a strict order (otherwise, decimal
-    # is placed before the others because its regex is longer,
-    # and this is bad)
-    #
-    @TOKEN(floating_constant)
-    def t_FLOAT_CONST(self, t):
-        return t
-
-    @TOKEN(hex_floating_constant)
-    def t_HEX_FLOAT_CONST(self, t):
-        return t
-
-    @TOKEN(hex_constant)
-    def t_INT_CONST_HEX(self, t):
-        return t
-
-    @TOKEN(bad_octal_constant)
-    def t_BAD_CONST_OCT(self, t):
-        msg = "Invalid octal constant"
-        self._error(msg, t)
-
-    @TOKEN(octal_constant)
-    def t_INT_CONST_OCT(self, t):
-        return t
-
-    @TOKEN(decimal_constant)
-    def t_INT_CONST_DEC(self, t):
-        return t
-
-    # Must come before bad_char_const, to prevent it from
-    # catching valid char constants as invalid
-    #
-    @TOKEN(char_const)
-    def t_CHAR_CONST(self, t):
-        return t
-
-    @TOKEN(wchar_const)
-    def t_WCHAR_CONST(self, t):
-        return t
-
-    @TOKEN(unmatched_quote)
-    def t_UNMATCHED_QUOTE(self, t):
-        msg = "Unmatched '"
-        self._error(msg, t)
-
-    @TOKEN(bad_char_const)
-    def t_BAD_CHAR_CONST(self, t):
-        msg = "Invalid char constant %s" % t.value
-        self._error(msg, t)
-
-    @TOKEN(wstring_literal)
-    def t_WSTRING_LITERAL(self, t):
-        return t
-
-    # unmatched string literals are caught by the preprocessor
-
-    @TOKEN(bad_string_literal)
-    def t_BAD_STRING_LITERAL(self, t):
-        msg = "String contains invalid escape code"
-        self._error(msg, t)
-
-    @TOKEN(identifier)
-    def t_ID(self, t):
-        t.type = self.keyword_map.get(t.value, "ID")
-        if t.type == 'ID' and self.type_lookup_func(t.value):
-            t.type = "TYPEID"
-        return t
-
-    def t_error(self, t):
-        msg = 'Illegal character %s' % repr(t.value[0])
-        self._error(msg, t)
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/c_parser.py b/Linux_i686/lib/python3.4/site-packages/pycparser/c_parser.py
deleted file mode 100644
index ae94f74..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/c_parser.py
+++ /dev/null
@@ -1,1634 +0,0 @@
-#------------------------------------------------------------------------------
-# pycparser: c_parser.py
-#
-# CParser class: Parser and AST builder for the C language
-#
-# Copyright (C) 2008-2013, Eli Bendersky
-# License: BSD
-#------------------------------------------------------------------------------
-import re
-
-from .ply import yacc
-
-from . import c_ast
-from .c_lexer import CLexer
-from .plyparser import PLYParser, Coord, ParseError
-from .ast_transforms import fix_switch_cases
-
-
-class CParser(PLYParser):
-    def __init__(
-            self,
-            lex_optimize=True,
-            lextab='pycparser.lextab',
-            yacc_optimize=True,
-            yacctab='pycparser.yacctab',
-            yacc_debug=False):
-        """ Create a new CParser.
-
-            Some arguments for controlling the debug/optimization
-            level of the parser are provided. The defaults are
-            tuned for release/performance mode.
-            The simple rules for using them are:
-            *) When tweaking CParser/CLexer, set these to False
-            *) When releasing a stable parser, set to True
-
-            lex_optimize:
-                Set to False when you're modifying the lexer.
-                Otherwise, changes in the lexer won't be used, if
-                some lextab.py file exists.
-                When releasing with a stable lexer, set to True
-                to save the re-generation of the lexer table on
-                each run.
-
-            lextab:
-                Points to the lex table that's used for optimized
-                mode. Only if you're modifying the lexer and want
-                some tests to avoid re-generating the table, make
-                this point to a local lex table file (that's been
-                earlier generated with lex_optimize=True)
-
-            yacc_optimize:
-                Set to False when you're modifying the parser.
-                Otherwise, changes in the parser won't be used, if
-                some parsetab.py file exists.
-                When releasing with a stable parser, set to True
-                to save the re-generation of the parser table on
-                each run.
-
-            yacctab:
-                Points to the yacc table that's used for optimized
-                mode. Only if you're modifying the parser, make
-                this point to a local yacc table file
-
-            yacc_debug:
-                Generate a parser.out file that explains how yacc
-                built the parsing table from the grammar.
-        """
-        self.clex = CLexer(
-            error_func=self._lex_error_func,
-            on_lbrace_func=self._lex_on_lbrace_func,
-            on_rbrace_func=self._lex_on_rbrace_func,
-            type_lookup_func=self._lex_type_lookup_func)
-
-        self.clex.build(
-            optimize=lex_optimize,
-            lextab=lextab)
-        self.tokens = self.clex.tokens
-
-        rules_with_opt = [
-            'abstract_declarator',
-            'assignment_expression',
-            'declaration_list',
-            'declaration_specifiers',
-            'designation',
-            'expression',
-            'identifier_list',
-            'init_declarator_list',
-            'parameter_type_list',
-            'specifier_qualifier_list',
-            'block_item_list',
-            'type_qualifier_list',
-            'struct_declarator_list'
-        ]
-
-        for rule in rules_with_opt:
-            self._create_opt_rule(rule)
-
-        self.cparser = yacc.yacc(
-            module=self,
-            start='translation_unit_or_empty',
-            debug=yacc_debug,
-            optimize=yacc_optimize,
-            tabmodule=yacctab)
-
-        # Stack of scopes for keeping track of symbols. _scope_stack[-1] is
-        # the current (topmost) scope. Each scope is a dictionary that
-        # specifies whether a name is a type. If _scope_stack[n][name] is
-        # True, 'name' is currently a type in the scope. If it's False,
-        # 'name' is used in the scope but not as a type (for instance, if we
-        # saw: int name;
-        # If 'name' is not a key in _scope_stack[n] then 'name' was not defined
-        # in this scope at all.
-        self._scope_stack = [dict()]
-
-        # Keeps track of the last token given to yacc (the lookahead token)
-        self._last_yielded_token = None
-
-    def parse(self, text, filename='', debuglevel=0):
-        """ Parses C code and returns an AST.
-
-            text:
-                A string containing the C source code
-
-            filename:
-                Name of the file being parsed (for meaningful
-                error messages)
-
-            debuglevel:
-                Debug level to yacc
-        """
-        self.clex.filename = filename
-        self.clex.reset_lineno()
-        self._scope_stack = [dict()]
-        self._last_yielded_token = None
-        return self.cparser.parse(
-                input=text,
-                lexer=self.clex,
-                debug=debuglevel)
-
-    ######################--   PRIVATE   --######################
-
-    def _push_scope(self):
-        self._scope_stack.append(dict())
-
-    def _pop_scope(self):
-        assert len(self._scope_stack) > 1
-        self._scope_stack.pop()
-
-    def _add_typedef_name(self, name, coord):
-        """ Add a new typedef name (ie a TYPEID) to the current scope
-        """
-        if not self._scope_stack[-1].get(name, True):
-            self._parse_error(
-                "Typedef %r previously declared as non-typedef "
-                "in this scope" % name, coord)
-        self._scope_stack[-1][name] = True
-
-    def _add_identifier(self, name, coord):
-        """ Add a new object, function, or enum member name (ie an ID) to the
-            current scope
-        """
-        if self._scope_stack[-1].get(name, False):
-            self._parse_error(
-                "Non-typedef %r previously declared as typedef "
-                "in this scope" % name, coord)
-        self._scope_stack[-1][name] = False
-
-    def _is_type_in_scope(self, name):
-        """ Is *name* a typedef-name in the current scope?
-        """
-        for scope in reversed(self._scope_stack):
-            # If name is an identifier in this scope it shadows typedefs in
-            # higher scopes.
-            in_scope = scope.get(name)
-            if in_scope is not None: return in_scope
-        return False
-
-    def _lex_error_func(self, msg, line, column):
-        self._parse_error(msg, self._coord(line, column))
-
-    def _lex_on_lbrace_func(self):
-        self._push_scope()
-
-    def _lex_on_rbrace_func(self):
-        self._pop_scope()
-
-    def _lex_type_lookup_func(self, name):
-        """ Looks up types that were previously defined with
-            typedef.
-            Passed to the lexer for recognizing identifiers that
-            are types.
-        """
-        is_type = self._is_type_in_scope(name)
-        return is_type
-
-    def _get_yacc_lookahead_token(self):
-        """ We need access to yacc's lookahead token in certain cases.
-            This is the last token yacc requested from the lexer, so we
-            ask the lexer.
-        """
-        return self.clex.last_token
-
-    # To understand what's going on here, read sections A.8.5 and
-    # A.8.6 of K&R2 very carefully.
-    #
-    # A C type consists of a basic type declaration, with a list
-    # of modifiers. For example:
-    #
-    # int *c[5];
-    #
-    # The basic declaration here is 'int c', and the pointer and
-    # the array are the modifiers.
-    #
-    # Basic declarations are represented by TypeDecl (from module
-    # c_ast) and the modifiers are FuncDecl, PtrDecl and
-    # ArrayDecl.
-    #
-    # The standard states that whenever a new modifier is parsed,
-    # it should be added to the end of the list of modifiers. For
-    # example:
-    #
-    # K&R2 A.8.6.2: Array Declarators
-    #
-    # In a declaration T D where D has the form
-    #   D1 [constant-expression-opt]
-    # and the type of the identifier in the declaration T D1 is
-    # "type-modifier T", the type of the
-    # identifier of D is "type-modifier array of T"
-    #
-    # This is what this method does. The declarator it receives
-    # can be a list of declarators ending with TypeDecl. It
-    # tacks the modifier to the end of this list, just before
-    # the TypeDecl.
-    #
-    # Additionally, the modifier may be a list itself. This is
-    # useful for pointers, that can come as a chain from the rule
-    # p_pointer. In this case, the whole modifier list is spliced
-    # into the new location.
-    #
-    def _type_modify_decl(self, decl, modifier):
-        """ Tacks a type modifier on a declarator, and returns
-            the modified declarator.
-
-            Note: the declarator and modifier may be modified
-        """
-        #~ print '****'
-        #~ decl.show(offset=3)
-        #~ modifier.show(offset=3)
-        #~ print '****'
-
-        modifier_head = modifier
-        modifier_tail = modifier
-
-        # The modifier may be a nested list. Reach its tail.
-        #
-        while modifier_tail.type:
-            modifier_tail = modifier_tail.type
-
-        # If the decl is a basic type, just tack the modifier onto
-        # it
-        #
-        if isinstance(decl, c_ast.TypeDecl):
-            modifier_tail.type = decl
-            return modifier
-        else:
-            # Otherwise, the decl is a list of modifiers. Reach
-            # its tail and splice the modifier onto the tail,
-            # pointing to the underlying basic type.
-            #
-            decl_tail = decl
-
-            while not isinstance(decl_tail.type, c_ast.TypeDecl):
-                decl_tail = decl_tail.type
-
-            modifier_tail.type = decl_tail.type
-            decl_tail.type = modifier_head
-            return decl
-
-    # Due to the order in which declarators are constructed,
-    # they have to be fixed in order to look like a normal AST.
-    #
-    # When a declaration arrives from syntax construction, it has
-    # these problems:
-    # * The innermost TypeDecl has no type (because the basic
-    #   type is only known at the uppermost declaration level)
-    # * The declaration has no variable name, since that is saved
-    #   in the innermost TypeDecl
-    # * The typename of the declaration is a list of type
-    #   specifiers, and not a node. Here, basic identifier types
-    #   should be separated from more complex types like enums
-    #   and structs.
-    #
-    # This method fixes these problems.
-    #
-    def _fix_decl_name_type(self, decl, typename):
-        """ Fixes a declaration. Modifies decl.
-        """
-        # Reach the underlying basic type
-        #
-        type = decl
-        while not isinstance(type, c_ast.TypeDecl):
-            type = type.type
-
-        decl.name = type.declname
-        type.quals = decl.quals
-
-        # The typename is a list of types. If any type in this
-        # list isn't an IdentifierType, it must be the only
-        # type in the list (it's illegal to declare "int enum ..")
-        # If all the types are basic, they're collected in the
-        # IdentifierType holder.
-        #
-        for tn in typename:
-            if not isinstance(tn, c_ast.IdentifierType):
-                if len(typename) > 1:
-                    self._parse_error(
-                        "Invalid multiple types specified", tn.coord)
-                else:
-                    type.type = tn
-                    return decl
-
-        if not typename:
-            # Functions default to returning int
-            #
-            if not isinstance(decl.type, c_ast.FuncDecl):
-                self._parse_error(
-                        "Missing type in declaration", decl.coord)
-            type.type = c_ast.IdentifierType(
-                    ['int'],
-                    coord=decl.coord)
-        else:
-            # At this point, we know that typename is a list of IdentifierType
-            # nodes. Concatenate all the names into a single list.
-            #
-            type.type = c_ast.IdentifierType(
-                [name for id in typename for name in id.names],
-                coord=typename[0].coord)
-        return decl
-
-    def _add_declaration_specifier(self, declspec, newspec, kind):
-        """ Declaration specifiers are represented by a dictionary
-            with the entries:
-            * qual: a list of type qualifiers
-            * storage: a list of storage type qualifiers
-            * type: a list of type specifiers
-            * function: a list of function specifiers
-
-            This method is given a declaration specifier, and a
-            new specifier of a given kind.
-            Returns the declaration specifier, with the new
-            specifier incorporated.
-        """
-        spec = declspec or dict(qual=[], storage=[], type=[], function=[])
-        spec[kind].insert(0, newspec)
-        return spec
-
-    def _build_declarations(self, spec, decls, typedef_namespace=False):
-        """ Builds a list of declarations all sharing the given specifiers.
-            If typedef_namespace is true, each declared name is added
-            to the "typedef namespace", which also includes objects,
-            functions, and enum constants.
-        """
-        is_typedef = 'typedef' in spec['storage']
-        declarations = []
-
-        # Bit-fields are allowed to be unnamed.
-        #
-        if decls[0].get('bitsize') is not None:
-            pass
-
-        # When redeclaring typedef names as identifiers in inner scopes, a
-        # problem can occur where the identifier gets grouped into
-        # spec['type'], leaving decl as None.  This can only occur for the
-        # first declarator.
-        #
-        elif decls[0]['decl'] is None:
-            if len(spec['type']) < 2 or len(spec['type'][-1].names) != 1 or \
-                    not self._is_type_in_scope(spec['type'][-1].names[0]):
-                coord = '?'
-                for t in spec['type']:
-                    if hasattr(t, 'coord'):
-                        coord = t.coord
-                        break
-                self._parse_error('Invalid declaration', coord)
-
-            # Make this look as if it came from "direct_declarator:ID"
-            decls[0]['decl'] = c_ast.TypeDecl(
-                declname=spec['type'][-1].names[0],
-                type=None,
-                quals=None,
-                coord=spec['type'][-1].coord)
-            # Remove the "new" type's name from the end of spec['type']
-            del spec['type'][-1]
-
-        # A similar problem can occur where the declaration ends up looking
-        # like an abstract declarator.  Give it a name if this is the case.
-        #
-        elif not isinstance(decls[0]['decl'],
-                (c_ast.Struct, c_ast.Union, c_ast.IdentifierType)):
-            decls_0_tail = decls[0]['decl']
-            while not isinstance(decls_0_tail, c_ast.TypeDecl):
-                decls_0_tail = decls_0_tail.type
-            if decls_0_tail.declname is None:
-                decls_0_tail.declname = spec['type'][-1].names[0]
-                del spec['type'][-1]
-
-        for decl in decls:
-            assert decl['decl'] is not None
-            if is_typedef:
-                declaration = c_ast.Typedef(
-                    name=None,
-                    quals=spec['qual'],
-                    storage=spec['storage'],
-                    type=decl['decl'],
-                    coord=decl['decl'].coord)
-            else:
-                declaration = c_ast.Decl(
-                    name=None,
-                    quals=spec['qual'],
-                    storage=spec['storage'],
-                    funcspec=spec['function'],
-                    type=decl['decl'],
-                    init=decl.get('init'),
-                    bitsize=decl.get('bitsize'),
-                    coord=decl['decl'].coord)
-
-            if isinstance(declaration.type,
-                    (c_ast.Struct, c_ast.Union, c_ast.IdentifierType)):
-                fixed_decl = declaration
-            else:
-                fixed_decl = self._fix_decl_name_type(declaration, spec['type'])
-
-            # Add the type name defined by typedef to a
-            # symbol table (for usage in the lexer)
-            #
-            if typedef_namespace:
-                if is_typedef:
-                    self._add_typedef_name(fixed_decl.name, fixed_decl.coord)
-                else:
-                    self._add_identifier(fixed_decl.name, fixed_decl.coord)
-
-            declarations.append(fixed_decl)
-
-        return declarations
-
-    def _build_function_definition(self, spec, decl, param_decls, body):
-        """ Builds a function definition.
-        """
-        assert 'typedef' not in spec['storage']
-
-        declaration = self._build_declarations(
-            spec=spec,
-            decls=[dict(decl=decl, init=None)],
-            typedef_namespace=True)[0]
-
-        return c_ast.FuncDef(
-            decl=declaration,
-            param_decls=param_decls,
-            body=body,
-            coord=decl.coord)
-
-    def _select_struct_union_class(self, token):
-        """ Given a token (either STRUCT or UNION), selects the
-            appropriate AST class.
-        """
-        if token == 'struct':
-            return c_ast.Struct
-        else:
-            return c_ast.Union
-
-    ##
-    ## Precedence and associativity of operators
-    ##
-    precedence = (
-        ('left', 'LOR'),
-        ('left', 'LAND'),
-        ('left', 'OR'),
-        ('left', 'XOR'),
-        ('left', 'AND'),
-        ('left', 'EQ', 'NE'),
-        ('left', 'GT', 'GE', 'LT', 'LE'),
-        ('left', 'RSHIFT', 'LSHIFT'),
-        ('left', 'PLUS', 'MINUS'),
-        ('left', 'TIMES', 'DIVIDE', 'MOD')
-    )
-
-    ##
-    ## Grammar productions
-    ## Implementation of the BNF defined in K&R2 A.13
-    ##
-
-    # Wrapper around a translation unit, to allow for empty input.
-    # Not strictly part of the C99 Grammar, but useful in practice.
-    #
-    def p_translation_unit_or_empty(self, p):
-        """ translation_unit_or_empty   : translation_unit
-                                        | empty
-        """
-        if p[1] is None:
-            p[0] = c_ast.FileAST([])
-        else:
-            p[0] = c_ast.FileAST(p[1])
-
-    def p_translation_unit_1(self, p):
-        """ translation_unit    : external_declaration
-        """
-        # Note: external_declaration is already a list
-        #
-        p[0] = p[1]
-
-    def p_translation_unit_2(self, p):
-        """ translation_unit    : translation_unit external_declaration
-        """
-        if p[2] is not None:
-            p[1].extend(p[2])
-        p[0] = p[1]
-
-    # Declarations always come as lists (because they can be
-    # several in one line), so we wrap the function definition
-    # into a list as well, to make the return value of
-    # external_declaration homogenous.
-    #
-    def p_external_declaration_1(self, p):
-        """ external_declaration    : function_definition
-        """
-        p[0] = [p[1]]
-
-    def p_external_declaration_2(self, p):
-        """ external_declaration    : declaration
-        """
-        p[0] = p[1]
-
-    def p_external_declaration_3(self, p):
-        """ external_declaration    : pp_directive
-        """
-        p[0] = p[1]
-
-    def p_external_declaration_4(self, p):
-        """ external_declaration    : SEMI
-        """
-        p[0] = None
-
-    def p_pp_directive(self, p):
-        """ pp_directive  : PPHASH
-        """
-        self._parse_error('Directives not supported yet',
-            self._coord(p.lineno(1)))
-
-    # In function definitions, the declarator can be followed by
-    # a declaration list, for old "K&R style" function definitios.
-    #
-    def p_function_definition_1(self, p):
-        """ function_definition : declarator declaration_list_opt compound_statement
-        """
-        # no declaration specifiers - 'int' becomes the default type
-        spec = dict(
-            qual=[],
-            storage=[],
-            type=[c_ast.IdentifierType(['int'],
-                                       coord=self._coord(p.lineno(1)))],
-            function=[])
-
-        p[0] = self._build_function_definition(
-            spec=spec,
-            decl=p[1],
-            param_decls=p[2],
-            body=p[3])
-
-    def p_function_definition_2(self, p):
-        """ function_definition : declaration_specifiers declarator declaration_list_opt compound_statement
-        """
-        spec = p[1]
-
-        p[0] = self._build_function_definition(
-            spec=spec,
-            decl=p[2],
-            param_decls=p[3],
-            body=p[4])
-
-    def p_statement(self, p):
-        """ statement   : labeled_statement
-                        | expression_statement
-                        | compound_statement
-                        | selection_statement
-                        | iteration_statement
-                        | jump_statement
-        """
-        p[0] = p[1]
-
-    # In C, declarations can come several in a line:
-    #   int x, *px, romulo = 5;
-    #
-    # However, for the AST, we will split them to separate Decl
-    # nodes.
-    #
-    # This rule splits its declarations and always returns a list
-    # of Decl nodes, even if it's one element long.
-    #
-    def p_decl_body(self, p):
-        """ decl_body : declaration_specifiers init_declarator_list_opt
-        """
-        spec = p[1]
-
-        # p[2] (init_declarator_list_opt) is either a list or None
-        #
-        if p[2] is None:
-            # By the standard, you must have at least one declarator unless
-            # declaring a structure tag, a union tag, or the members of an
-            # enumeration.
-            #
-            ty = spec['type']
-            s_u_or_e = (c_ast.Struct, c_ast.Union, c_ast.Enum)
-            if len(ty) == 1 and isinstance(ty[0], s_u_or_e):
-                decls = [c_ast.Decl(
-                    name=None,
-                    quals=spec['qual'],
-                    storage=spec['storage'],
-                    funcspec=spec['function'],
-                    type=ty[0],
-                    init=None,
-                    bitsize=None,
-                    coord=ty[0].coord)]
-
-            # However, this case can also occur on redeclared identifiers in
-            # an inner scope.  The trouble is that the redeclared type's name
-            # gets grouped into declaration_specifiers; _build_declarations
-            # compensates for this.
-            #
-            else:
-                decls = self._build_declarations(
-                    spec=spec,
-                    decls=[dict(decl=None, init=None)],
-                    typedef_namespace=True)
-
-        else:
-            decls = self._build_declarations(
-                spec=spec,
-                decls=p[2],
-                typedef_namespace=True)
-
-        p[0] = decls
-
-    # The declaration has been split to a decl_body sub-rule and
-    # SEMI, because having them in a single rule created a problem
-    # for defining typedefs.
-    #
-    # If a typedef line was directly followed by a line using the
-    # type defined with the typedef, the type would not be
-    # recognized. This is because to reduce the declaration rule,
-    # the parser's lookahead asked for the token after SEMI, which
-    # was the type from the next line, and the lexer had no chance
-    # to see the updated type symbol table.
-    #
-    # Splitting solves this problem, because after seeing SEMI,
-    # the parser reduces decl_body, which actually adds the new
-    # type into the table to be seen by the lexer before the next
-    # line is reached.
-    def p_declaration(self, p):
-        """ declaration : decl_body SEMI
-        """
-        p[0] = p[1]
-
-    # Since each declaration is a list of declarations, this
-    # rule will combine all the declarations and return a single
-    # list
-    #
-    def p_declaration_list(self, p):
-        """ declaration_list    : declaration
-                                | declaration_list declaration
-        """
-        p[0] = p[1] if len(p) == 2 else p[1] + p[2]
-
-    def p_declaration_specifiers_1(self, p):
-        """ declaration_specifiers  : type_qualifier declaration_specifiers_opt
-        """
-        p[0] = self._add_declaration_specifier(p[2], p[1], 'qual')
-
-    def p_declaration_specifiers_2(self, p):
-        """ declaration_specifiers  : type_specifier declaration_specifiers_opt
-        """
-        p[0] = self._add_declaration_specifier(p[2], p[1], 'type')
-
-    def p_declaration_specifiers_3(self, p):
-        """ declaration_specifiers  : storage_class_specifier declaration_specifiers_opt
-        """
-        p[0] = self._add_declaration_specifier(p[2], p[1], 'storage')
-
-    def p_declaration_specifiers_4(self, p):
-        """ declaration_specifiers  : function_specifier declaration_specifiers_opt
-        """
-        p[0] = self._add_declaration_specifier(p[2], p[1], 'function')
-
-    def p_storage_class_specifier(self, p):
-        """ storage_class_specifier : AUTO
-                                    | REGISTER
-                                    | STATIC
-                                    | EXTERN
-                                    | TYPEDEF
-        """
-        p[0] = p[1]
-
-    def p_function_specifier(self, p):
-        """ function_specifier  : INLINE
-        """
-        p[0] = p[1]
-
-    def p_type_specifier_1(self, p):
-        """ type_specifier  : VOID
-                            | _BOOL
-                            | CHAR
-                            | SHORT
-                            | INT
-                            | LONG
-                            | FLOAT
-                            | DOUBLE
-                            | _COMPLEX
-                            | SIGNED
-                            | UNSIGNED
-        """
-        p[0] = c_ast.IdentifierType([p[1]], coord=self._coord(p.lineno(1)))
-
-    def p_type_specifier_2(self, p):
-        """ type_specifier  : typedef_name
-                            | enum_specifier
-                            | struct_or_union_specifier
-        """
-        p[0] = p[1]
-
-    def p_type_qualifier(self, p):
-        """ type_qualifier  : CONST
-                            | RESTRICT
-                            | VOLATILE
-        """
-        p[0] = p[1]
-
-    def p_init_declarator_list_1(self, p):
-        """ init_declarator_list    : init_declarator
-                                    | init_declarator_list COMMA init_declarator
-        """
-        p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]]
-
-    # If the code is declaring a variable that was declared a typedef in an
-    # outer scope, yacc will think the name is part of declaration_specifiers,
-    # not init_declarator, and will then get confused by EQUALS.  Pass None
-    # up in place of declarator, and handle this at a higher level.
-    #
-    def p_init_declarator_list_2(self, p):
-        """ init_declarator_list    : EQUALS initializer
-        """
-        p[0] = [dict(decl=None, init=p[2])]
-
-    # Similarly, if the code contains duplicate typedefs of, for example,
-    # array types, the array portion will appear as an abstract declarator.
-    #
-    def p_init_declarator_list_3(self, p):
-        """ init_declarator_list    : abstract_declarator
-        """
-        p[0] = [dict(decl=p[1], init=None)]
-
-    # Returns a {decl= : init=} dictionary
-    # If there's no initializer, uses None
-    #
-    def p_init_declarator(self, p):
-        """ init_declarator : declarator
-                            | declarator EQUALS initializer
-        """
-        p[0] = dict(decl=p[1], init=(p[3] if len(p) > 2 else None))
-
-    def p_specifier_qualifier_list_1(self, p):
-        """ specifier_qualifier_list    : type_qualifier specifier_qualifier_list_opt
-        """
-        p[0] = self._add_declaration_specifier(p[2], p[1], 'qual')
-
-    def p_specifier_qualifier_list_2(self, p):
-        """ specifier_qualifier_list    : type_specifier specifier_qualifier_list_opt
-        """
-        p[0] = self._add_declaration_specifier(p[2], p[1], 'type')
-
-    # TYPEID is allowed here (and in other struct/enum related tag names), because
-    # struct/enum tags reside in their own namespace and can be named the same as types
-    #
-    def p_struct_or_union_specifier_1(self, p):
-        """ struct_or_union_specifier   : struct_or_union ID
-                                        | struct_or_union TYPEID
-        """
-        klass = self._select_struct_union_class(p[1])
-        p[0] = klass(
-            name=p[2],
-            decls=None,
-            coord=self._coord(p.lineno(2)))
-
-    def p_struct_or_union_specifier_2(self, p):
-        """ struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
-        """
-        klass = self._select_struct_union_class(p[1])
-        p[0] = klass(
-            name=None,
-            decls=p[3],
-            coord=self._coord(p.lineno(2)))
-
-    def p_struct_or_union_specifier_3(self, p):
-        """ struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
-                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
-        """
-        klass = self._select_struct_union_class(p[1])
-        p[0] = klass(
-            name=p[2],
-            decls=p[4],
-            coord=self._coord(p.lineno(2)))
-
-    def p_struct_or_union(self, p):
-        """ struct_or_union : STRUCT
-                            | UNION
-        """
-        p[0] = p[1]
-
-    # Combine all declarations into a single list
-    #
-    def p_struct_declaration_list(self, p):
-        """ struct_declaration_list     : struct_declaration
-                                        | struct_declaration_list struct_declaration
-        """
-        p[0] = p[1] if len(p) == 2 else p[1] + p[2]
-
-    def p_struct_declaration_1(self, p):
-        """ struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
-        """
-        spec = p[1]
-        assert 'typedef' not in spec['storage']
-
-        if p[2] is not None:
-            decls = self._build_declarations(
-                spec=spec,
-                decls=p[2])
-
-        elif len(spec['type']) == 1:
-            # Anonymous struct/union, gcc extension, C1x feature.
-            # Although the standard only allows structs/unions here, I see no
-            # reason to disallow other types since some compilers have typedefs
-            # here, and pycparser isn't about rejecting all invalid code.
-            #
-            node = spec['type'][0]
-            if isinstance(node, c_ast.Node):
-                decl_type = node
-            else:
-                decl_type = c_ast.IdentifierType(node)
-
-            decls = self._build_declarations(
-                spec=spec,
-                decls=[dict(decl=decl_type)])
-
-        else:
-            # Structure/union members can have the same names as typedefs.
-            # The trouble is that the member's name gets grouped into
-            # specifier_qualifier_list; _build_declarations compensates.
-            #
-            decls = self._build_declarations(
-                spec=spec,
-                decls=[dict(decl=None, init=None)])
-
-        p[0] = decls
-
-    def p_struct_declaration_2(self, p):
-        """ struct_declaration : specifier_qualifier_list abstract_declarator SEMI
-        """
-        # "Abstract declarator?!", you ask?  Structure members can have the
-        # same names as typedefs.  The trouble is that the member's name gets
-        # grouped into specifier_qualifier_list, leaving any remainder to
-        # appear as an abstract declarator, as in:
-        #   typedef int Foo;
-        #   struct { Foo Foo[3]; };
-        #
-        p[0] = self._build_declarations(
-                spec=p[1],
-                decls=[dict(decl=p[2], init=None)])
-
-    def p_struct_declarator_list(self, p):
-        """ struct_declarator_list  : struct_declarator
-                                    | struct_declarator_list COMMA struct_declarator
-        """
-        p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]]
-
-    # struct_declarator passes up a dict with the keys: decl (for
-    # the underlying declarator) and bitsize (for the bitsize)
-    #
-    def p_struct_declarator_1(self, p):
-        """ struct_declarator : declarator
-        """
-        p[0] = {'decl': p[1], 'bitsize': None}
-
-    def p_struct_declarator_2(self, p):
-        """ struct_declarator   : declarator COLON constant_expression
-                                | COLON constant_expression
-        """
-        if len(p) > 3:
-            p[0] = {'decl': p[1], 'bitsize': p[3]}
-        else:
-            p[0] = {'decl': c_ast.TypeDecl(None, None, None), 'bitsize': p[2]}
-
-    def p_enum_specifier_1(self, p):
-        """ enum_specifier  : ENUM ID
-                            | ENUM TYPEID
-        """
-        p[0] = c_ast.Enum(p[2], None, self._coord(p.lineno(1)))
-
-    def p_enum_specifier_2(self, p):
-        """ enum_specifier  : ENUM brace_open enumerator_list brace_close
-        """
-        p[0] = c_ast.Enum(None, p[3], self._coord(p.lineno(1)))
-
-    def p_enum_specifier_3(self, p):
-        """ enum_specifier  : ENUM ID brace_open enumerator_list brace_close
-                            | ENUM TYPEID brace_open enumerator_list brace_close
-        """
-        p[0] = c_ast.Enum(p[2], p[4], self._coord(p.lineno(1)))
-
-    def p_enumerator_list(self, p):
-        """ enumerator_list : enumerator
-                            | enumerator_list COMMA
-                            | enumerator_list COMMA enumerator
-        """
-        if len(p) == 2:
-            p[0] = c_ast.EnumeratorList([p[1]], p[1].coord)
-        elif len(p) == 3:
-            p[0] = p[1]
-        else:
-            p[1].enumerators.append(p[3])
-            p[0] = p[1]
-
-    def p_enumerator(self, p):
-        """ enumerator  : ID
-                        | ID EQUALS constant_expression
-        """
-        if len(p) == 2:
-            enumerator = c_ast.Enumerator(
-                        p[1], None,
-                        self._coord(p.lineno(1)))
-        else:
-            enumerator = c_ast.Enumerator(
-                        p[1], p[3],
-                        self._coord(p.lineno(1)))
-        self._add_identifier(enumerator.name, enumerator.coord)
-
-        p[0] = enumerator
-
-    def p_declarator_1(self, p):
-        """ declarator  : direct_declarator
-        """
-        p[0] = p[1]
-
-    def p_declarator_2(self, p):
-        """ declarator  : pointer direct_declarator
-        """
-        p[0] = self._type_modify_decl(p[2], p[1])
-
-    # Since it's impossible for a type to be specified after a pointer, assume
-    # it's intended to be the name for this declaration.  _add_identifier will
-    # raise an error if this TYPEID can't be redeclared.
-    #
-    def p_declarator_3(self, p):
-        """ declarator  : pointer TYPEID
-        """
-        decl = c_ast.TypeDecl(
-            declname=p[2],
-            type=None,
-            quals=None,
-            coord=self._coord(p.lineno(2)))
-
-        p[0] = self._type_modify_decl(decl, p[1])
-
-    def p_direct_declarator_1(self, p):
-        """ direct_declarator   : ID
-        """
-        p[0] = c_ast.TypeDecl(
-            declname=p[1],
-            type=None,
-            quals=None,
-            coord=self._coord(p.lineno(1)))
-
-    def p_direct_declarator_2(self, p):
-        """ direct_declarator   : LPAREN declarator RPAREN
-        """
-        p[0] = p[2]
-
-    def p_direct_declarator_3(self, p):
-        """ direct_declarator   : direct_declarator LBRACKET assignment_expression_opt RBRACKET
-        """
-        arr = c_ast.ArrayDecl(
-            type=None,
-            dim=p[3],
-            coord=p[1].coord)
-
-        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
-
-    # Special for VLAs
-    #
-    def p_direct_declarator_4(self, p):
-        """ direct_declarator   : direct_declarator LBRACKET TIMES RBRACKET
-        """
-        arr = c_ast.ArrayDecl(
-            type=None,
-            dim=c_ast.ID(p[3], self._coord(p.lineno(3))),
-            coord=p[1].coord)
-
-        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
-
-    def p_direct_declarator_5(self, p):
-        """ direct_declarator   : direct_declarator LPAREN parameter_type_list RPAREN
-                                | direct_declarator LPAREN identifier_list_opt RPAREN
-        """
-        func = c_ast.FuncDecl(
-            args=p[3],
-            type=None,
-            coord=p[1].coord)
-
-        # To see why _get_yacc_lookahead_token is needed, consider:
-        #   typedef char TT;
-        #   void foo(int TT) { TT = 10; }
-        # Outside the function, TT is a typedef, but inside (starting and
-        # ending with the braces) it's a parameter.  The trouble begins with
-        # yacc's lookahead token.  We don't know if we're declaring or
-        # defining a function until we see LBRACE, but if we wait for yacc to
-        # trigger a rule on that token, then TT will have already been read
-        # and incorrectly interpreted as TYPEID.  We need to add the
-        # parameters to the scope the moment the lexer sees LBRACE.
-        #
-        if self._get_yacc_lookahead_token().type == "LBRACE":
-            if func.args is not None:
-                for param in func.args.params:
-                    if isinstance(param, c_ast.EllipsisParam): break
-                    self._add_identifier(param.name, param.coord)
-
-        p[0] = self._type_modify_decl(decl=p[1], modifier=func)
-
-    def p_pointer(self, p):
-        """ pointer : TIMES type_qualifier_list_opt
-                    | TIMES type_qualifier_list_opt pointer
-        """
-        coord = self._coord(p.lineno(1))
-
-        p[0] = c_ast.PtrDecl(
-            quals=p[2] or [],
-            type=p[3] if len(p) > 3 else None,
-            coord=coord)
-
-    def p_type_qualifier_list(self, p):
-        """ type_qualifier_list : type_qualifier
-                                | type_qualifier_list type_qualifier
-        """
-        p[0] = [p[1]] if len(p) == 2 else p[1] + [p[2]]
-
-    def p_parameter_type_list(self, p):
-        """ parameter_type_list : parameter_list
-                                | parameter_list COMMA ELLIPSIS
-        """
-        if len(p) > 2:
-            p[1].params.append(c_ast.EllipsisParam(self._coord(p.lineno(3))))
-
-        p[0] = p[1]
-
-    def p_parameter_list(self, p):
-        """ parameter_list  : parameter_declaration
-                            | parameter_list COMMA parameter_declaration
-        """
-        if len(p) == 2: # single parameter
-            p[0] = c_ast.ParamList([p[1]], p[1].coord)
-        else:
-            p[1].params.append(p[3])
-            p[0] = p[1]
-
-    def p_parameter_declaration_1(self, p):
-        """ parameter_declaration   : declaration_specifiers declarator
-        """
-        spec = p[1]
-        if not spec['type']:
-            spec['type'] = [c_ast.IdentifierType(['int'],
-                coord=self._coord(p.lineno(1)))]
-        p[0] = self._build_declarations(
-            spec=spec,
-            decls=[dict(decl=p[2])])[0]
-
-    def p_parameter_declaration_2(self, p):
-        """ parameter_declaration   : declaration_specifiers abstract_declarator_opt
-        """
-        spec = p[1]
-        if not spec['type']:
-            spec['type'] = [c_ast.IdentifierType(['int'],
-                coord=self._coord(p.lineno(1)))]
-
-        # Parameters can have the same names as typedefs.  The trouble is that
-        # the parameter's name gets grouped into declaration_specifiers, making
-        # it look like an old-style declaration; compensate.
-        #
-        if len(spec['type']) > 1 and len(spec['type'][-1].names) == 1 and \
-                self._is_type_in_scope(spec['type'][-1].names[0]):
-            decl = self._build_declarations(
-                    spec=spec,
-                    decls=[dict(decl=p[2], init=None)])[0]
-
-        # This truly is an old-style parameter declaration
-        #
-        else:
-            decl = c_ast.Typename(
-                quals=spec['qual'],
-                type=p[2] or c_ast.TypeDecl(None, None, None),
-                coord=self._coord(p.lineno(2)))
-            typename = spec['type']
-            decl = self._fix_decl_name_type(decl, typename)
-
-        p[0] = decl
-
-    def p_identifier_list(self, p):
-        """ identifier_list : identifier
-                            | identifier_list COMMA identifier
-        """
-        if len(p) == 2: # single parameter
-            p[0] = c_ast.ParamList([p[1]], p[1].coord)
-        else:
-            p[1].params.append(p[3])
-            p[0] = p[1]
-
-    def p_initializer_1(self, p):
-        """ initializer : assignment_expression
-        """
-        p[0] = p[1]
-
-    def p_initializer_2(self, p):
-        """ initializer : brace_open initializer_list brace_close
-                        | brace_open initializer_list COMMA brace_close
-        """
-        p[0] = p[2]
-
-    def p_initializer_list(self, p):
-        """ initializer_list    : designation_opt initializer
-                                | initializer_list COMMA designation_opt initializer
-        """
-        if len(p) == 3: # single initializer
-            init = p[2] if p[1] is None else c_ast.NamedInitializer(p[1], p[2])
-            p[0] = c_ast.InitList([init], p[2].coord)
-        else:
-            init = p[4] if p[3] is None else c_ast.NamedInitializer(p[3], p[4])
-            p[1].exprs.append(init)
-            p[0] = p[1]
-
-    def p_designation(self, p):
-        """ designation : designator_list EQUALS
-        """
-        p[0] = p[1]
-
-    # Designators are represented as a list of nodes, in the order in which
-    # they're written in the code.
-    #
-    def p_designator_list(self, p):
-        """ designator_list : designator
-                            | designator_list designator
-        """
-        p[0] = [p[1]] if len(p) == 2 else p[1] + [p[2]]
-
-    def p_designator(self, p):
-        """ designator  : LBRACKET constant_expression RBRACKET
-                        | PERIOD identifier
-        """
-        p[0] = p[2]
-
-    def p_type_name(self, p):
-        """ type_name   : specifier_qualifier_list abstract_declarator_opt
-        """
-        #~ print '=========='
-        #~ print p[1]
-        #~ print p[2]
-        #~ print p[2].children()
-        #~ print '=========='
-
-        typename = c_ast.Typename(
-            quals=p[1]['qual'],
-            type=p[2] or c_ast.TypeDecl(None, None, None),
-            coord=self._coord(p.lineno(2)))
-
-        p[0] = self._fix_decl_name_type(typename, p[1]['type'])
-
-    def p_abstract_declarator_1(self, p):
-        """ abstract_declarator     : pointer
-        """
-        dummytype = c_ast.TypeDecl(None, None, None)
-        p[0] = self._type_modify_decl(
-            decl=dummytype,
-            modifier=p[1])
-
-    def p_abstract_declarator_2(self, p):
-        """ abstract_declarator     : pointer direct_abstract_declarator
-        """
-        p[0] = self._type_modify_decl(p[2], p[1])
-
-    def p_abstract_declarator_3(self, p):
-        """ abstract_declarator     : direct_abstract_declarator
-        """
-        p[0] = p[1]
-
-    # Creating and using direct_abstract_declarator_opt here
-    # instead of listing both direct_abstract_declarator and the
-    # lack of it in the beginning of _1 and _2 caused two
-    # shift/reduce errors.
-    #
-    def p_direct_abstract_declarator_1(self, p):
-        """ direct_abstract_declarator  : LPAREN abstract_declarator RPAREN """
-        p[0] = p[2]
-
-    def p_direct_abstract_declarator_2(self, p):
-        """ direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
-        """
-        arr = c_ast.ArrayDecl(
-            type=None,
-            dim=p[3],
-            coord=p[1].coord)
-
-        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
-
-    def p_direct_abstract_declarator_3(self, p):
-        """ direct_abstract_declarator  : LBRACKET assignment_expression_opt RBRACKET
-        """
-        p[0] = c_ast.ArrayDecl(
-            type=c_ast.TypeDecl(None, None, None),
-            dim=p[2],
-            coord=self._coord(p.lineno(1)))
-
-    def p_direct_abstract_declarator_4(self, p):
-        """ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
-        """
-        arr = c_ast.ArrayDecl(
-            type=None,
-            dim=c_ast.ID(p[3], self._coord(p.lineno(3))),
-            coord=p[1].coord)
-
-        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
-
-    def p_direct_abstract_declarator_5(self, p):
-        """ direct_abstract_declarator  : LBRACKET TIMES RBRACKET
-        """
-        p[0] = c_ast.ArrayDecl(
-            type=c_ast.TypeDecl(None, None, None),
-            dim=c_ast.ID(p[3], self._coord(p.lineno(3))),
-            coord=self._coord(p.lineno(1)))
-
-    def p_direct_abstract_declarator_6(self, p):
-        """ direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
-        """
-        func = c_ast.FuncDecl(
-            args=p[3],
-            type=None,
-            coord=p[1].coord)
-
-        p[0] = self._type_modify_decl(decl=p[1], modifier=func)
-
-    def p_direct_abstract_declarator_7(self, p):
-        """ direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
-        """
-        p[0] = c_ast.FuncDecl(
-            args=p[2],
-            type=c_ast.TypeDecl(None, None, None),
-            coord=self._coord(p.lineno(1)))
-
-    # declaration is a list, statement isn't. To make it consistent, block_item
-    # will always be a list
-    #
-    def p_block_item(self, p):
-        """ block_item  : declaration
-                        | statement
-        """
-        p[0] = p[1] if isinstance(p[1], list) else [p[1]]
-
-    # Since we made block_item a list, this just combines lists
-    #
-    def p_block_item_list(self, p):
-        """ block_item_list : block_item
-                            | block_item_list block_item
-        """
-        # Empty block items (plain ';') produce [None], so ignore them
-        p[0] = p[1] if (len(p) == 2 or p[2] == [None]) else p[1] + p[2]
-
-    def p_compound_statement_1(self, p):
-        """ compound_statement : brace_open block_item_list_opt brace_close """
-        p[0] = c_ast.Compound(
-            block_items=p[2],
-            coord=self._coord(p.lineno(1)))
-
-    def p_labeled_statement_1(self, p):
-        """ labeled_statement : ID COLON statement """
-        p[0] = c_ast.Label(p[1], p[3], self._coord(p.lineno(1)))
-
-    def p_labeled_statement_2(self, p):
-        """ labeled_statement : CASE constant_expression COLON statement """
-        p[0] = c_ast.Case(p[2], [p[4]], self._coord(p.lineno(1)))
-
-    def p_labeled_statement_3(self, p):
-        """ labeled_statement : DEFAULT COLON statement """
-        p[0] = c_ast.Default([p[3]], self._coord(p.lineno(1)))
-
-    def p_selection_statement_1(self, p):
-        """ selection_statement : IF LPAREN expression RPAREN statement """
-        p[0] = c_ast.If(p[3], p[5], None, self._coord(p.lineno(1)))
-
-    def p_selection_statement_2(self, p):
-        """ selection_statement : IF LPAREN expression RPAREN statement ELSE statement """
-        p[0] = c_ast.If(p[3], p[5], p[7], self._coord(p.lineno(1)))
-
-    def p_selection_statement_3(self, p):
-        """ selection_statement : SWITCH LPAREN expression RPAREN statement """
-        p[0] = fix_switch_cases(
-                c_ast.Switch(p[3], p[5], self._coord(p.lineno(1))))
-
-    def p_iteration_statement_1(self, p):
-        """ iteration_statement : WHILE LPAREN expression RPAREN statement """
-        p[0] = c_ast.While(p[3], p[5], self._coord(p.lineno(1)))
-
-    def p_iteration_statement_2(self, p):
-        """ iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI """
-        p[0] = c_ast.DoWhile(p[5], p[2], self._coord(p.lineno(1)))
-
-    def p_iteration_statement_3(self, p):
-        """ iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement """
-        p[0] = c_ast.For(p[3], p[5], p[7], p[9], self._coord(p.lineno(1)))
-
-    def p_iteration_statement_4(self, p):
-        """ iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement """
-        p[0] = c_ast.For(c_ast.DeclList(p[3]), p[4], p[6], p[8], self._coord(p.lineno(1)))
-
-    def p_jump_statement_1(self, p):
-        """ jump_statement  : GOTO ID SEMI """
-        p[0] = c_ast.Goto(p[2], self._coord(p.lineno(1)))
-
-    def p_jump_statement_2(self, p):
-        """ jump_statement  : BREAK SEMI """
-        p[0] = c_ast.Break(self._coord(p.lineno(1)))
-
-    def p_jump_statement_3(self, p):
-        """ jump_statement  : CONTINUE SEMI """
-        p[0] = c_ast.Continue(self._coord(p.lineno(1)))
-
-    def p_jump_statement_4(self, p):
-        """ jump_statement  : RETURN expression SEMI
-                            | RETURN SEMI
-        """
-        p[0] = c_ast.Return(p[2] if len(p) == 4 else None, self._coord(p.lineno(1)))
-
-    def p_expression_statement(self, p):
-        """ expression_statement : expression_opt SEMI """
-        if p[1] is None:
-            p[0] = c_ast.EmptyStatement(self._coord(p.lineno(1)))
-        else:
-            p[0] = p[1]
-
-    def p_expression(self, p):
-        """ expression  : assignment_expression
-                        | expression COMMA assignment_expression
-        """
-        if len(p) == 2:
-            p[0] = p[1]
-        else:
-            if not isinstance(p[1], c_ast.ExprList):
-                p[1] = c_ast.ExprList([p[1]], p[1].coord)
-
-            p[1].exprs.append(p[3])
-            p[0] = p[1]
-
-    def p_typedef_name(self, p):
-        """ typedef_name : TYPEID """
-        p[0] = c_ast.IdentifierType([p[1]], coord=self._coord(p.lineno(1)))
-
-    def p_assignment_expression(self, p):
-        """ assignment_expression   : conditional_expression
-                                    | unary_expression assignment_operator assignment_expression
-        """
-        if len(p) == 2:
-            p[0] = p[1]
-        else:
-            p[0] = c_ast.Assignment(p[2], p[1], p[3], p[1].coord)
-
-    # K&R2 defines these as many separate rules, to encode
-    # precedence and associativity. Why work hard ? I'll just use
-    # the built in precedence/associativity specification feature
-    # of PLY. (see precedence declaration above)
-    #
-    def p_assignment_operator(self, p):
-        """ assignment_operator : EQUALS
-                                | XOREQUAL
-                                | TIMESEQUAL
-                                | DIVEQUAL
-                                | MODEQUAL
-                                | PLUSEQUAL
-                                | MINUSEQUAL
-                                | LSHIFTEQUAL
-                                | RSHIFTEQUAL
-                                | ANDEQUAL
-                                | OREQUAL
-        """
-        p[0] = p[1]
-
-    def p_constant_expression(self, p):
-        """ constant_expression : conditional_expression """
-        p[0] = p[1]
-
-    def p_conditional_expression(self, p):
-        """ conditional_expression  : binary_expression
-                                    | binary_expression CONDOP expression COLON conditional_expression
-        """
-        if len(p) == 2:
-            p[0] = p[1]
-        else:
-            p[0] = c_ast.TernaryOp(p[1], p[3], p[5], p[1].coord)
-
-    def p_binary_expression(self, p):
-        """ binary_expression   : cast_expression
-                                | binary_expression TIMES binary_expression
-                                | binary_expression DIVIDE binary_expression
-                                | binary_expression MOD binary_expression
-                                | binary_expression PLUS binary_expression
-                                | binary_expression MINUS binary_expression
-                                | binary_expression RSHIFT binary_expression
-                                | binary_expression LSHIFT binary_expression
-                                | binary_expression LT binary_expression
-                                | binary_expression LE binary_expression
-                                | binary_expression GE binary_expression
-                                | binary_expression GT binary_expression
-                                | binary_expression EQ binary_expression
-                                | binary_expression NE binary_expression
-                                | binary_expression AND binary_expression
-                                | binary_expression OR binary_expression
-                                | binary_expression XOR binary_expression
-                                | binary_expression LAND binary_expression
-                                | binary_expression LOR binary_expression
-        """
-        if len(p) == 2:
-            p[0] = p[1]
-        else:
-            p[0] = c_ast.BinaryOp(p[2], p[1], p[3], p[1].coord)
-
-    def p_cast_expression_1(self, p):
-        """ cast_expression : unary_expression """
-        p[0] = p[1]
-
-    def p_cast_expression_2(self, p):
-        """ cast_expression : LPAREN type_name RPAREN cast_expression """
-        p[0] = c_ast.Cast(p[2], p[4], self._coord(p.lineno(1)))
-
-    def p_unary_expression_1(self, p):
-        """ unary_expression    : postfix_expression """
-        p[0] = p[1]
-
-    def p_unary_expression_2(self, p):
-        """ unary_expression    : PLUSPLUS unary_expression
-                                | MINUSMINUS unary_expression
-                                | unary_operator cast_expression
-        """
-        p[0] = c_ast.UnaryOp(p[1], p[2], p[2].coord)
-
-    def p_unary_expression_3(self, p):
-        """ unary_expression    : SIZEOF unary_expression
-                                | SIZEOF LPAREN type_name RPAREN
-        """
-        p[0] = c_ast.UnaryOp(
-            p[1],
-            p[2] if len(p) == 3 else p[3],
-            self._coord(p.lineno(1)))
-
-    def p_unary_operator(self, p):
-        """ unary_operator  : AND
-                            | TIMES
-                            | PLUS
-                            | MINUS
-                            | NOT
-                            | LNOT
-        """
-        p[0] = p[1]
-
-    def p_postfix_expression_1(self, p):
-        """ postfix_expression  : primary_expression """
-        p[0] = p[1]
-
-    def p_postfix_expression_2(self, p):
-        """ postfix_expression  : postfix_expression LBRACKET expression RBRACKET """
-        p[0] = c_ast.ArrayRef(p[1], p[3], p[1].coord)
-
-    def p_postfix_expression_3(self, p):
-        """ postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
-                                | postfix_expression LPAREN RPAREN
-        """
-        p[0] = c_ast.FuncCall(p[1], p[3] if len(p) == 5 else None, p[1].coord)
-
-    def p_postfix_expression_4(self, p):
-        """ postfix_expression  : postfix_expression PERIOD ID
-                                | postfix_expression PERIOD TYPEID
-                                | postfix_expression ARROW ID
-                                | postfix_expression ARROW TYPEID
-        """
-        field = c_ast.ID(p[3], self._coord(p.lineno(3)))
-        p[0] = c_ast.StructRef(p[1], p[2], field, p[1].coord)
-
-    def p_postfix_expression_5(self, p):
-        """ postfix_expression  : postfix_expression PLUSPLUS
-                                | postfix_expression MINUSMINUS
-        """
-        p[0] = c_ast.UnaryOp('p' + p[2], p[1], p[1].coord)
-
-    def p_postfix_expression_6(self, p):
-        """ postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
-                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
-        """
-        p[0] = c_ast.CompoundLiteral(p[2], p[5])
-
-    def p_primary_expression_1(self, p):
-        """ primary_expression  : identifier """
-        p[0] = p[1]
-
-    def p_primary_expression_2(self, p):
-        """ primary_expression  : constant """
-        p[0] = p[1]
-
-    def p_primary_expression_3(self, p):
-        """ primary_expression  : unified_string_literal
-                                | unified_wstring_literal
-        """
-        p[0] = p[1]
-
-    def p_primary_expression_4(self, p):
-        """ primary_expression  : LPAREN expression RPAREN """
-        p[0] = p[2]
-
-    def p_argument_expression_list(self, p):
-        """ argument_expression_list    : assignment_expression
-                                        | argument_expression_list COMMA assignment_expression
-        """
-        if len(p) == 2: # single expr
-            p[0] = c_ast.ExprList([p[1]], p[1].coord)
-        else:
-            p[1].exprs.append(p[3])
-            p[0] = p[1]
-
-    def p_identifier(self, p):
-        """ identifier  : ID """
-        p[0] = c_ast.ID(p[1], self._coord(p.lineno(1)))
-
-    def p_constant_1(self, p):
-        """ constant    : INT_CONST_DEC
-                        | INT_CONST_OCT
-                        | INT_CONST_HEX
-        """
-        p[0] = c_ast.Constant(
-            'int', p[1], self._coord(p.lineno(1)))
-
-    def p_constant_2(self, p):
-        """ constant    : FLOAT_CONST
-                        | HEX_FLOAT_CONST
-        """
-        p[0] = c_ast.Constant(
-            'float', p[1], self._coord(p.lineno(1)))
-
-    def p_constant_3(self, p):
-        """ constant    : CHAR_CONST
-                        | WCHAR_CONST
-        """
-        p[0] = c_ast.Constant(
-            'char', p[1], self._coord(p.lineno(1)))
-
-    # The "unified" string and wstring literal rules are for supporting
-    # concatenation of adjacent string literals.
-    # I.e. "hello " "world" is seen by the C compiler as a single string literal
-    # with the value "hello world"
-    #
-    def p_unified_string_literal(self, p):
-        """ unified_string_literal  : STRING_LITERAL
-                                    | unified_string_literal STRING_LITERAL
-        """
-        if len(p) == 2: # single literal
-            p[0] = c_ast.Constant(
-                'string', p[1], self._coord(p.lineno(1)))
-        else:
-            p[1].value = p[1].value[:-1] + p[2][1:]
-            p[0] = p[1]
-
-    def p_unified_wstring_literal(self, p):
-        """ unified_wstring_literal : WSTRING_LITERAL
-                                    | unified_wstring_literal WSTRING_LITERAL
-        """
-        if len(p) == 2: # single literal
-            p[0] = c_ast.Constant(
-                'string', p[1], self._coord(p.lineno(1)))
-        else:
-            p[1].value = p[1].value.rstrip[:-1] + p[2][1:]
-            p[0] = p[1]
-
-    def p_brace_open(self, p):
-        """ brace_open  :   LBRACE
-        """
-        p[0] = p[1]
-
-    def p_brace_close(self, p):
-        """ brace_close :   RBRACE
-        """
-        p[0] = p[1]
-
-    def p_empty(self, p):
-        'empty : '
-        p[0] = None
-
-    def p_error(self, p):
-        # If error recovery is added here in the future, make sure
-        # _get_yacc_lookahead_token still works!
-        #
-        if p:
-            self._parse_error(
-                'before: %s' % p.value,
-                self._coord(lineno=p.lineno,
-                            column=self.clex.find_tok_column(p)))
-        else:
-            self._parse_error('At end of input', '')
-
-
-#------------------------------------------------------------------------------
-if __name__ == "__main__":
-    import pprint
-    import time, sys
-
-    #t1 = time.time()
-    #parser = CParser(lex_optimize=True, yacc_debug=True, yacc_optimize=False)
-    #sys.write(time.time() - t1)
-
-    #buf = '''
-        #int (*k)(int);
-    #'''
-
-    ## set debuglevel to 2 for debugging
-    #t = parser.parse(buf, 'x.c', debuglevel=0)
-    #t.show(showcoord=True)
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/lextab.py b/Linux_i686/lib/python3.4/site-packages/pycparser/lextab.py
deleted file mode 100644
index 4241902..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/lextab.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# pycparser.lextab.py. This file automatically created by PLY (version 3.4). Don't edit!
-_tabversion   = '3.4'
-_lextokens    = {'VOID': 1, 'LBRACKET': 1, 'WCHAR_CONST': 1, 'FLOAT_CONST': 1, 'MINUS': 1, 'RPAREN': 1, 'LONG': 1, 'PLUS': 1, 'ELLIPSIS': 1, 'GT': 1, 'GOTO': 1, 'ENUM': 1, 'PERIOD': 1, 'GE': 1, 'INT_CONST_DEC': 1, 'ARROW': 1, 'HEX_FLOAT_CONST': 1, 'DOUBLE': 1, 'MINUSEQUAL': 1, 'INT_CONST_OCT': 1, 'TIMESEQUAL': 1, 'OR': 1, 'SHORT': 1, 'RETURN': 1, 'RSHIFTEQUAL': 1, 'RESTRICT': 1, 'STATIC': 1, 'SIZEOF': 1, 'UNSIGNED': 1, 'UNION': 1, 'COLON': 1, 'WSTRING_LITERAL': 1, 'DIVIDE': 1, 'FOR': 1, 'PLUSPLUS': 1, 'EQUALS': 1, 'ELSE': 1, 'INLINE': 1, 'EQ': 1, 'AND': 1, 'TYPEID': 1, 'LBRACE': 1, 'PPHASH': 1, 'INT': 1, 'SIGNED': 1, 'CONTINUE': 1, 'NOT': 1, 'OREQUAL': 1, 'MOD': 1, 'RSHIFT': 1, 'DEFAULT': 1, 'CHAR': 1, 'WHILE': 1, 'DIVEQUAL': 1, 'EXTERN': 1, 'CASE': 1, 'LAND': 1, 'REGISTER': 1, 'MODEQUAL': 1, 'NE': 1, 'SWITCH': 1, 'INT_CONST_HEX': 1, '_COMPLEX': 1, 'PLUSEQUAL': 1, 'STRUCT': 1, 'CONDOP': 1, 'BREAK': 1, 'VOLATILE': 1, 'ANDEQUAL': 1, 'DO': 1, 'LNOT': 1, 'CONST': 1, 'LOR': 1, 'CHAR_CONST': 1, 'LSHIFT': 1, 'RBRACE': 1, '_BOOL': 1, 'LE': 1, 'SEMI': 1, 'LT': 1, 'COMMA': 1, 'TYPEDEF': 1, 'XOR': 1, 'AUTO': 1, 'TIMES': 1, 'LPAREN': 1, 'MINUSMINUS': 1, 'ID': 1, 'IF': 1, 'STRING_LITERAL': 1, 'FLOAT': 1, 'XOREQUAL': 1, 'LSHIFTEQUAL': 1, 'RBRACKET': 1}
-_lexreflags   = 0
-_lexliterals  = ''
-_lexstateinfo = {'ppline': 'exclusive', 'pppragma': 'exclusive', 'INITIAL': 'inclusive'}
-_lexstatere   = {'ppline': [('(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P\\n)|(?Pline)', [None, ('t_ppline_FILENAME', 'FILENAME'), None, None, None, None, None, None, ('t_ppline_LINE_NUMBER', 'LINE_NUMBER'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_ppline_NEWLINE', 'NEWLINE'), ('t_ppline_PPLINE', 'PPLINE')])], 'pppragma': [('(?P\\n)|(?Ppragma)|(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P[a-zA-Z_$][0-9a-zA-Z_$]*)', [None, ('t_pppragma_NEWLINE', 'NEWLINE'), ('t_pppragma_PPPRAGMA', 'PPPRAGMA'), ('t_pppragma_STR', 'STR'), None, None, None, None, None, None, ('t_pppragma_ID', 'ID')])], 'INITIAL': [('(?P[ \\t]*\\#)|(?P\\n+)|(?P\\{)|(?P\\})|(?P((((([0-9]*\\.[0-9]+)|([0-9]+\\.))([eE][-+]?[0-9]+)?)|([0-9]+([eE][-+]?[0-9]+)))[FfLl]?))|(?P(0[xX]([0-9a-fA-F]+|((([0-9a-fA-F]+)?\\.[0-9a-fA-F]+)|([0-9a-fA-F]+\\.)))([pP][+-]?[0-9]+)[FfLl]?))|(?P0[xX][0-9a-fA-F]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)', [None, ('t_PPHASH', 'PPHASH'), ('t_NEWLINE', 'NEWLINE'), ('t_LBRACE', 'LBRACE'), ('t_RBRACE', 'RBRACE'), ('t_FLOAT_CONST', 'FLOAT_CONST'), None, None, None, None, None, None, None, None, None, ('t_HEX_FLOAT_CONST', 'HEX_FLOAT_CONST'), None, None, None, None, None, None, None, ('t_INT_CONST_HEX', 'INT_CONST_HEX')]), ('(?P0[0-7]*[89])|(?P0[0-7]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))\')|(?PL\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))\')|(?P(\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*\\n)|(\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*$))|(?P(\'([^\'\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))[^\'\n]+\')|(\'\')|(\'([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-7])[^\'\\n]*\'))|(?PL"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")', [None, ('t_BAD_CONST_OCT', 'BAD_CONST_OCT'), ('t_INT_CONST_OCT', 'INT_CONST_OCT'), None, None, None, None, None, None, None, ('t_INT_CONST_DEC', 'INT_CONST_DEC'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_CHAR_CONST', 'CHAR_CONST'), None, None, None, None, None, None, ('t_WCHAR_CONST', 'WCHAR_CONST'), None, None, None, None, None, None, ('t_UNMATCHED_QUOTE', 'UNMATCHED_QUOTE'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_BAD_CHAR_CONST', 'BAD_CHAR_CONST'), None, None, None, None, None, None, None, None, None, None, ('t_WSTRING_LITERAL', 'WSTRING_LITERAL')]), ('(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-7])([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P[a-zA-Z_$][0-9a-zA-Z_$]*)|(?P"([^"\\\\\\n]|(\\\\(([a-zA-Z._~!=&\\^\\-\\\\?\'"])|(\\d+)|(x[0-9a-fA-F]+))))*")|(?P\\.\\.\\.)|(?P\\+\\+)|(?P\\|\\|)|(?P\\^=)|(?P\\|=)|(?P<<=)|(?P>>=)|(?P\\+=)|(?P\\*=)|(?P\\+)|(?P%=)|(?P/=)|(?P\\])', [None, ('t_BAD_STRING_LITERAL', 'BAD_STRING_LITERAL'), None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_ID', 'ID'), (None, 'STRING_LITERAL'), None, None, None, None, None, None, (None, 'ELLIPSIS'), (None, 'PLUSPLUS'), (None, 'LOR'), (None, 'XOREQUAL'), (None, 'OREQUAL'), (None, 'LSHIFTEQUAL'), (None, 'RSHIFTEQUAL'), (None, 'PLUSEQUAL'), (None, 'TIMESEQUAL'), (None, 'PLUS'), (None, 'MODEQUAL'), (None, 'DIVEQUAL'), (None, 'RBRACKET')]), ('(?P\\?)|(?P\\^)|(?P<<)|(?P<=)|(?P\\()|(?P->)|(?P==)|(?P!=)|(?P--)|(?P\\|)|(?P\\*)|(?P\\[)|(?P>=)|(?P\\))|(?P&&)|(?P>>)|(?P&=)|(?P-=)|(?P\\.)|(?P=)|(?P<)|(?P,)|(?P/)|(?P&)|(?P%)|(?P;)|(?P-)|(?P>)|(?P:)|(?P~)|(?P!)', [None, (None, 'CONDOP'), (None, 'XOR'), (None, 'LSHIFT'), (None, 'LE'), (None, 'LPAREN'), (None, 'ARROW'), (None, 'EQ'), (None, 'NE'), (None, 'MINUSMINUS'), (None, 'OR'), (None, 'TIMES'), (None, 'LBRACKET'), (None, 'GE'), (None, 'RPAREN'), (None, 'LAND'), (None, 'RSHIFT'), (None, 'ANDEQUAL'), (None, 'MINUSEQUAL'), (None, 'PERIOD'), (None, 'EQUALS'), (None, 'LT'), (None, 'COMMA'), (None, 'DIVIDE'), (None, 'AND'), (None, 'MOD'), (None, 'SEMI'), (None, 'MINUS'), (None, 'GT'), (None, 'COLON'), (None, 'NOT'), (None, 'LNOT')])]}
-_lexstateignore = {'ppline': ' \t', 'pppragma': ' \t<>.-{}();+-*/$%@&^~!?:,0123456789', 'INITIAL': ' \t'}
-_lexstateerrorf = {'ppline': 't_ppline_error', 'pppragma': 't_pppragma_error', 'INITIAL': 't_error'}
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/__init__.py b/Linux_i686/lib/python3.4/site-packages/pycparser/ply/__init__.py
deleted file mode 100644
index 853a985..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-# PLY package
-# Author: David Beazley (dave@dabeaz.com)
-
-__all__ = ['lex','yacc']
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/cpp.py b/Linux_i686/lib/python3.4/site-packages/pycparser/ply/cpp.py
deleted file mode 100644
index 5cad682..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/cpp.py
+++ /dev/null
@@ -1,898 +0,0 @@
-# -----------------------------------------------------------------------------
-# cpp.py
-#
-# Author:  David Beazley (http://www.dabeaz.com)
-# Copyright (C) 2007
-# All rights reserved
-#
-# This module implements an ANSI-C style lexical preprocessor for PLY. 
-# -----------------------------------------------------------------------------
-from __future__ import generators
-
-# -----------------------------------------------------------------------------
-# Default preprocessor lexer definitions.   These tokens are enough to get
-# a basic preprocessor working.   Other modules may import these if they want
-# -----------------------------------------------------------------------------
-
-tokens = (
-   'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT', 'CPP_POUND','CPP_DPOUND'
-)
-
-literals = "+-*/%|&~^<>=!?()[]{}.,;:\\\'\""
-
-# Whitespace
-def t_CPP_WS(t):
-    r'\s+'
-    t.lexer.lineno += t.value.count("\n")
-    return t
-
-t_CPP_POUND = r'\#'
-t_CPP_DPOUND = r'\#\#'
-
-# Identifier
-t_CPP_ID = r'[A-Za-z_][\w_]*'
-
-# Integer literal
-def CPP_INTEGER(t):
-    r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU]|[lL]|[uU][lL]|[lL][uU])?)'
-    return t
-
-t_CPP_INTEGER = CPP_INTEGER
-
-# Floating literal
-t_CPP_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?'
-
-# String literal
-def t_CPP_STRING(t):
-    r'\"([^\\\n]|(\\(.|\n)))*?\"'
-    t.lexer.lineno += t.value.count("\n")
-    return t
-
-# Character constant 'c' or L'c'
-def t_CPP_CHAR(t):
-    r'(L)?\'([^\\\n]|(\\(.|\n)))*?\''
-    t.lexer.lineno += t.value.count("\n")
-    return t
-
-# Comment
-def t_CPP_COMMENT(t):
-    r'(/\*(.|\n)*?\*/)|(//.*?\n)'
-    t.lexer.lineno += t.value.count("\n")
-    return t
-    
-def t_error(t):
-    t.type = t.value[0]
-    t.value = t.value[0]
-    t.lexer.skip(1)
-    return t
-
-import re
-import copy
-import time
-import os.path
-
-# -----------------------------------------------------------------------------
-# trigraph()
-# 
-# Given an input string, this function replaces all trigraph sequences. 
-# The following mapping is used:
-#
-#     ??=    #
-#     ??/    \
-#     ??'    ^
-#     ??(    [
-#     ??)    ]
-#     ??!    |
-#     ??<    {
-#     ??>    }
-#     ??-    ~
-# -----------------------------------------------------------------------------
-
-_trigraph_pat = re.compile(r'''\?\?[=/\'\(\)\!<>\-]''')
-_trigraph_rep = {
-    '=':'#',
-    '/':'\\',
-    "'":'^',
-    '(':'[',
-    ')':']',
-    '!':'|',
-    '<':'{',
-    '>':'}',
-    '-':'~'
-}
-
-def trigraph(input):
-    return _trigraph_pat.sub(lambda g: _trigraph_rep[g.group()[-1]],input)
-
-# ------------------------------------------------------------------
-# Macro object
-#
-# This object holds information about preprocessor macros
-#
-#    .name      - Macro name (string)
-#    .value     - Macro value (a list of tokens)
-#    .arglist   - List of argument names
-#    .variadic  - Boolean indicating whether or not variadic macro
-#    .vararg    - Name of the variadic parameter
-#
-# When a macro is created, the macro replacement token sequence is
-# pre-scanned and used to create patch lists that are later used
-# during macro expansion
-# ------------------------------------------------------------------
-
-class Macro(object):
-    def __init__(self,name,value,arglist=None,variadic=False):
-        self.name = name
-        self.value = value
-        self.arglist = arglist
-        self.variadic = variadic
-        if variadic:
-            self.vararg = arglist[-1]
-        self.source = None
-
-# ------------------------------------------------------------------
-# Preprocessor object
-#
-# Object representing a preprocessor.  Contains macro definitions,
-# include directories, and other information
-# ------------------------------------------------------------------
-
-class Preprocessor(object):
-    def __init__(self,lexer=None):
-        if lexer is None:
-            lexer = lex.lexer
-        self.lexer = lexer
-        self.macros = { }
-        self.path = []
-        self.temp_path = []
-
-        # Probe the lexer for selected tokens
-        self.lexprobe()
-
-        tm = time.localtime()
-        self.define("__DATE__ \"%s\"" % time.strftime("%b %d %Y",tm))
-        self.define("__TIME__ \"%s\"" % time.strftime("%H:%M:%S",tm))
-        self.parser = None
-
-    # -----------------------------------------------------------------------------
-    # tokenize()
-    #
-    # Utility function. Given a string of text, tokenize into a list of tokens
-    # -----------------------------------------------------------------------------
-
-    def tokenize(self,text):
-        tokens = []
-        self.lexer.input(text)
-        while True:
-            tok = self.lexer.token()
-            if not tok: break
-            tokens.append(tok)
-        return tokens
-
-    # ---------------------------------------------------------------------
-    # error()
-    #
-    # Report a preprocessor error/warning of some kind
-    # ----------------------------------------------------------------------
-
-    def error(self,file,line,msg):
-        print("%s:%d %s" % (file,line,msg))
-
-    # ----------------------------------------------------------------------
-    # lexprobe()
-    #
-    # This method probes the preprocessor lexer object to discover
-    # the token types of symbols that are important to the preprocessor.
-    # If this works right, the preprocessor will simply "work"
-    # with any suitable lexer regardless of how tokens have been named.
-    # ----------------------------------------------------------------------
-
-    def lexprobe(self):
-
-        # Determine the token type for identifiers
-        self.lexer.input("identifier")
-        tok = self.lexer.token()
-        if not tok or tok.value != "identifier":
-            print("Couldn't determine identifier type")
-        else:
-            self.t_ID = tok.type
-
-        # Determine the token type for integers
-        self.lexer.input("12345")
-        tok = self.lexer.token()
-        if not tok or int(tok.value) != 12345:
-            print("Couldn't determine integer type")
-        else:
-            self.t_INTEGER = tok.type
-            self.t_INTEGER_TYPE = type(tok.value)
-
-        # Determine the token type for strings enclosed in double quotes
-        self.lexer.input("\"filename\"")
-        tok = self.lexer.token()
-        if not tok or tok.value != "\"filename\"":
-            print("Couldn't determine string type")
-        else:
-            self.t_STRING = tok.type
-
-        # Determine the token type for whitespace--if any
-        self.lexer.input("  ")
-        tok = self.lexer.token()
-        if not tok or tok.value != "  ":
-            self.t_SPACE = None
-        else:
-            self.t_SPACE = tok.type
-
-        # Determine the token type for newlines
-        self.lexer.input("\n")
-        tok = self.lexer.token()
-        if not tok or tok.value != "\n":
-            self.t_NEWLINE = None
-            print("Couldn't determine token for newlines")
-        else:
-            self.t_NEWLINE = tok.type
-
-        self.t_WS = (self.t_SPACE, self.t_NEWLINE)
-
-        # Check for other characters used by the preprocessor
-        chars = [ '<','>','#','##','\\','(',')',',','.']
-        for c in chars:
-            self.lexer.input(c)
-            tok = self.lexer.token()
-            if not tok or tok.value != c:
-                print("Unable to lex '%s' required for preprocessor" % c)
-
-    # ----------------------------------------------------------------------
-    # add_path()
-    #
-    # Adds a search path to the preprocessor.  
-    # ----------------------------------------------------------------------
-
-    def add_path(self,path):
-        self.path.append(path)
-
-    # ----------------------------------------------------------------------
-    # group_lines()
-    #
-    # Given an input string, this function splits it into lines.  Trailing whitespace
-    # is removed.   Any line ending with \ is grouped with the next line.  This
-    # function forms the lowest level of the preprocessor---grouping into text into
-    # a line-by-line format.
-    # ----------------------------------------------------------------------
-
-    def group_lines(self,input):
-        lex = self.lexer.clone()
-        lines = [x.rstrip() for x in input.splitlines()]
-        for i in xrange(len(lines)):
-            j = i+1
-            while lines[i].endswith('\\') and (j < len(lines)):
-                lines[i] = lines[i][:-1]+lines[j]
-                lines[j] = ""
-                j += 1
-
-        input = "\n".join(lines)
-        lex.input(input)
-        lex.lineno = 1
-
-        current_line = []
-        while True:
-            tok = lex.token()
-            if not tok:
-                break
-            current_line.append(tok)
-            if tok.type in self.t_WS and '\n' in tok.value:
-                yield current_line
-                current_line = []
-
-        if current_line:
-            yield current_line
-
-    # ----------------------------------------------------------------------
-    # tokenstrip()
-    # 
-    # Remove leading/trailing whitespace tokens from a token list
-    # ----------------------------------------------------------------------
-
-    def tokenstrip(self,tokens):
-        i = 0
-        while i < len(tokens) and tokens[i].type in self.t_WS:
-            i += 1
-        del tokens[:i]
-        i = len(tokens)-1
-        while i >= 0 and tokens[i].type in self.t_WS:
-            i -= 1
-        del tokens[i+1:]
-        return tokens
-
-
-    # ----------------------------------------------------------------------
-    # collect_args()
-    #
-    # Collects comma separated arguments from a list of tokens.   The arguments
-    # must be enclosed in parenthesis.  Returns a tuple (tokencount,args,positions)
-    # where tokencount is the number of tokens consumed, args is a list of arguments,
-    # and positions is a list of integers containing the starting index of each
-    # argument.  Each argument is represented by a list of tokens.
-    #
-    # When collecting arguments, leading and trailing whitespace is removed
-    # from each argument.  
-    #
-    # This function properly handles nested parenthesis and commas---these do not
-    # define new arguments.
-    # ----------------------------------------------------------------------
-
-    def collect_args(self,tokenlist):
-        args = []
-        positions = []
-        current_arg = []
-        nesting = 1
-        tokenlen = len(tokenlist)
-    
-        # Search for the opening '('.
-        i = 0
-        while (i < tokenlen) and (tokenlist[i].type in self.t_WS):
-            i += 1
-
-        if (i < tokenlen) and (tokenlist[i].value == '('):
-            positions.append(i+1)
-        else:
-            self.error(self.source,tokenlist[0].lineno,"Missing '(' in macro arguments")
-            return 0, [], []
-
-        i += 1
-
-        while i < tokenlen:
-            t = tokenlist[i]
-            if t.value == '(':
-                current_arg.append(t)
-                nesting += 1
-            elif t.value == ')':
-                nesting -= 1
-                if nesting == 0:
-                    if current_arg:
-                        args.append(self.tokenstrip(current_arg))
-                        positions.append(i)
-                    return i+1,args,positions
-                current_arg.append(t)
-            elif t.value == ',' and nesting == 1:
-                args.append(self.tokenstrip(current_arg))
-                positions.append(i+1)
-                current_arg = []
-            else:
-                current_arg.append(t)
-            i += 1
-    
-        # Missing end argument
-        self.error(self.source,tokenlist[-1].lineno,"Missing ')' in macro arguments")
-        return 0, [],[]
-
-    # ----------------------------------------------------------------------
-    # macro_prescan()
-    #
-    # Examine the macro value (token sequence) and identify patch points
-    # This is used to speed up macro expansion later on---we'll know
-    # right away where to apply patches to the value to form the expansion
-    # ----------------------------------------------------------------------
-    
-    def macro_prescan(self,macro):
-        macro.patch     = []             # Standard macro arguments 
-        macro.str_patch = []             # String conversion expansion
-        macro.var_comma_patch = []       # Variadic macro comma patch
-        i = 0
-        while i < len(macro.value):
-            if macro.value[i].type == self.t_ID and macro.value[i].value in macro.arglist:
-                argnum = macro.arglist.index(macro.value[i].value)
-                # Conversion of argument to a string
-                if i > 0 and macro.value[i-1].value == '#':
-                    macro.value[i] = copy.copy(macro.value[i])
-                    macro.value[i].type = self.t_STRING
-                    del macro.value[i-1]
-                    macro.str_patch.append((argnum,i-1))
-                    continue
-                # Concatenation
-                elif (i > 0 and macro.value[i-1].value == '##'):
-                    macro.patch.append(('c',argnum,i-1))
-                    del macro.value[i-1]
-                    continue
-                elif ((i+1) < len(macro.value) and macro.value[i+1].value == '##'):
-                    macro.patch.append(('c',argnum,i))
-                    i += 1
-                    continue
-                # Standard expansion
-                else:
-                    macro.patch.append(('e',argnum,i))
-            elif macro.value[i].value == '##':
-                if macro.variadic and (i > 0) and (macro.value[i-1].value == ',') and \
-                        ((i+1) < len(macro.value)) and (macro.value[i+1].type == self.t_ID) and \
-                        (macro.value[i+1].value == macro.vararg):
-                    macro.var_comma_patch.append(i-1)
-            i += 1
-        macro.patch.sort(key=lambda x: x[2],reverse=True)
-
-    # ----------------------------------------------------------------------
-    # macro_expand_args()
-    #
-    # Given a Macro and list of arguments (each a token list), this method
-    # returns an expanded version of a macro.  The return value is a token sequence
-    # representing the replacement macro tokens
-    # ----------------------------------------------------------------------
-
-    def macro_expand_args(self,macro,args):
-        # Make a copy of the macro token sequence
-        rep = [copy.copy(_x) for _x in macro.value]
-
-        # Make string expansion patches.  These do not alter the length of the replacement sequence
-        
-        str_expansion = {}
-        for argnum, i in macro.str_patch:
-            if argnum not in str_expansion:
-                str_expansion[argnum] = ('"%s"' % "".join([x.value for x in args[argnum]])).replace("\\","\\\\")
-            rep[i] = copy.copy(rep[i])
-            rep[i].value = str_expansion[argnum]
-
-        # Make the variadic macro comma patch.  If the variadic macro argument is empty, we get rid
-        comma_patch = False
-        if macro.variadic and not args[-1]:
-            for i in macro.var_comma_patch:
-                rep[i] = None
-                comma_patch = True
-
-        # Make all other patches.   The order of these matters.  It is assumed that the patch list
-        # has been sorted in reverse order of patch location since replacements will cause the
-        # size of the replacement sequence to expand from the patch point.
-        
-        expanded = { }
-        for ptype, argnum, i in macro.patch:
-            # Concatenation.   Argument is left unexpanded
-            if ptype == 'c':
-                rep[i:i+1] = args[argnum]
-            # Normal expansion.  Argument is macro expanded first
-            elif ptype == 'e':
-                if argnum not in expanded:
-                    expanded[argnum] = self.expand_macros(args[argnum])
-                rep[i:i+1] = expanded[argnum]
-
-        # Get rid of removed comma if necessary
-        if comma_patch:
-            rep = [_i for _i in rep if _i]
-
-        return rep
-
-
-    # ----------------------------------------------------------------------
-    # expand_macros()
-    #
-    # Given a list of tokens, this function performs macro expansion.
-    # The expanded argument is a dictionary that contains macros already
-    # expanded.  This is used to prevent infinite recursion.
-    # ----------------------------------------------------------------------
-
-    def expand_macros(self,tokens,expanded=None):
-        if expanded is None:
-            expanded = {}
-        i = 0
-        while i < len(tokens):
-            t = tokens[i]
-            if t.type == self.t_ID:
-                if t.value in self.macros and t.value not in expanded:
-                    # Yes, we found a macro match
-                    expanded[t.value] = True
-                    
-                    m = self.macros[t.value]
-                    if not m.arglist:
-                        # A simple macro
-                        ex = self.expand_macros([copy.copy(_x) for _x in m.value],expanded)
-                        for e in ex:
-                            e.lineno = t.lineno
-                        tokens[i:i+1] = ex
-                        i += len(ex)
-                    else:
-                        # A macro with arguments
-                        j = i + 1
-                        while j < len(tokens) and tokens[j].type in self.t_WS:
-                            j += 1
-                        if tokens[j].value == '(':
-                            tokcount,args,positions = self.collect_args(tokens[j:])
-                            if not m.variadic and len(args) !=  len(m.arglist):
-                                self.error(self.source,t.lineno,"Macro %s requires %d arguments" % (t.value,len(m.arglist)))
-                                i = j + tokcount
-                            elif m.variadic and len(args) < len(m.arglist)-1:
-                                if len(m.arglist) > 2:
-                                    self.error(self.source,t.lineno,"Macro %s must have at least %d arguments" % (t.value, len(m.arglist)-1))
-                                else:
-                                    self.error(self.source,t.lineno,"Macro %s must have at least %d argument" % (t.value, len(m.arglist)-1))
-                                i = j + tokcount
-                            else:
-                                if m.variadic:
-                                    if len(args) == len(m.arglist)-1:
-                                        args.append([])
-                                    else:
-                                        args[len(m.arglist)-1] = tokens[j+positions[len(m.arglist)-1]:j+tokcount-1]
-                                        del args[len(m.arglist):]
-                                        
-                                # Get macro replacement text
-                                rep = self.macro_expand_args(m,args)
-                                rep = self.expand_macros(rep,expanded)
-                                for r in rep:
-                                    r.lineno = t.lineno
-                                tokens[i:j+tokcount] = rep
-                                i += len(rep)
-                    del expanded[t.value]
-                    continue
-                elif t.value == '__LINE__':
-                    t.type = self.t_INTEGER
-                    t.value = self.t_INTEGER_TYPE(t.lineno)
-                
-            i += 1
-        return tokens
-
-    # ----------------------------------------------------------------------    
-    # evalexpr()
-    # 
-    # Evaluate an expression token sequence for the purposes of evaluating
-    # integral expressions.
-    # ----------------------------------------------------------------------
-
-    def evalexpr(self,tokens):
-        # tokens = tokenize(line)
-        # Search for defined macros
-        i = 0
-        while i < len(tokens):
-            if tokens[i].type == self.t_ID and tokens[i].value == 'defined':
-                j = i + 1
-                needparen = False
-                result = "0L"
-                while j < len(tokens):
-                    if tokens[j].type in self.t_WS:
-                        j += 1
-                        continue
-                    elif tokens[j].type == self.t_ID:
-                        if tokens[j].value in self.macros:
-                            result = "1L"
-                        else:
-                            result = "0L"
-                        if not needparen: break
-                    elif tokens[j].value == '(':
-                        needparen = True
-                    elif tokens[j].value == ')':
-                        break
-                    else:
-                        self.error(self.source,tokens[i].lineno,"Malformed defined()")
-                    j += 1
-                tokens[i].type = self.t_INTEGER
-                tokens[i].value = self.t_INTEGER_TYPE(result)
-                del tokens[i+1:j+1]
-            i += 1
-        tokens = self.expand_macros(tokens)
-        for i,t in enumerate(tokens):
-            if t.type == self.t_ID:
-                tokens[i] = copy.copy(t)
-                tokens[i].type = self.t_INTEGER
-                tokens[i].value = self.t_INTEGER_TYPE("0L")
-            elif t.type == self.t_INTEGER:
-                tokens[i] = copy.copy(t)
-                # Strip off any trailing suffixes
-                tokens[i].value = str(tokens[i].value)
-                while tokens[i].value[-1] not in "0123456789abcdefABCDEF":
-                    tokens[i].value = tokens[i].value[:-1]
-        
-        expr = "".join([str(x.value) for x in tokens])
-        expr = expr.replace("&&"," and ")
-        expr = expr.replace("||"," or ")
-        expr = expr.replace("!"," not ")
-        try:
-            result = eval(expr)
-        except StandardError:
-            self.error(self.source,tokens[0].lineno,"Couldn't evaluate expression")
-            result = 0
-        return result
-
-    # ----------------------------------------------------------------------
-    # parsegen()
-    #
-    # Parse an input string/
-    # ----------------------------------------------------------------------
-    def parsegen(self,input,source=None):
-
-        # Replace trigraph sequences
-        t = trigraph(input)
-        lines = self.group_lines(t)
-
-        if not source:
-            source = ""
-            
-        self.define("__FILE__ \"%s\"" % source)
-
-        self.source = source
-        chunk = []
-        enable = True
-        iftrigger = False
-        ifstack = []
-
-        for x in lines:
-            for i,tok in enumerate(x):
-                if tok.type not in self.t_WS: break
-            if tok.value == '#':
-                # Preprocessor directive
-
-                for tok in x:
-                    if tok in self.t_WS and '\n' in tok.value:
-                        chunk.append(tok)
-                
-                dirtokens = self.tokenstrip(x[i+1:])
-                if dirtokens:
-                    name = dirtokens[0].value
-                    args = self.tokenstrip(dirtokens[1:])
-                else:
-                    name = ""
-                    args = []
-                
-                if name == 'define':
-                    if enable:
-                        for tok in self.expand_macros(chunk):
-                            yield tok
-                        chunk = []
-                        self.define(args)
-                elif name == 'include':
-                    if enable:
-                        for tok in self.expand_macros(chunk):
-                            yield tok
-                        chunk = []
-                        oldfile = self.macros['__FILE__']
-                        for tok in self.include(args):
-                            yield tok
-                        self.macros['__FILE__'] = oldfile
-                        self.source = source
-                elif name == 'undef':
-                    if enable:
-                        for tok in self.expand_macros(chunk):
-                            yield tok
-                        chunk = []
-                        self.undef(args)
-                elif name == 'ifdef':
-                    ifstack.append((enable,iftrigger))
-                    if enable:
-                        if not args[0].value in self.macros:
-                            enable = False
-                            iftrigger = False
-                        else:
-                            iftrigger = True
-                elif name == 'ifndef':
-                    ifstack.append((enable,iftrigger))
-                    if enable:
-                        if args[0].value in self.macros:
-                            enable = False
-                            iftrigger = False
-                        else:
-                            iftrigger = True
-                elif name == 'if':
-                    ifstack.append((enable,iftrigger))
-                    if enable:
-                        result = self.evalexpr(args)
-                        if not result:
-                            enable = False
-                            iftrigger = False
-                        else:
-                            iftrigger = True
-                elif name == 'elif':
-                    if ifstack:
-                        if ifstack[-1][0]:     # We only pay attention if outer "if" allows this
-                            if enable:         # If already true, we flip enable False
-                                enable = False
-                            elif not iftrigger:   # If False, but not triggered yet, we'll check expression
-                                result = self.evalexpr(args)
-                                if result:
-                                    enable  = True
-                                    iftrigger = True
-                    else:
-                        self.error(self.source,dirtokens[0].lineno,"Misplaced #elif")
-                        
-                elif name == 'else':
-                    if ifstack:
-                        if ifstack[-1][0]:
-                            if enable:
-                                enable = False
-                            elif not iftrigger:
-                                enable = True
-                                iftrigger = True
-                    else:
-                        self.error(self.source,dirtokens[0].lineno,"Misplaced #else")
-
-                elif name == 'endif':
-                    if ifstack:
-                        enable,iftrigger = ifstack.pop()
-                    else:
-                        self.error(self.source,dirtokens[0].lineno,"Misplaced #endif")
-                else:
-                    # Unknown preprocessor directive
-                    pass
-
-            else:
-                # Normal text
-                if enable:
-                    chunk.extend(x)
-
-        for tok in self.expand_macros(chunk):
-            yield tok
-        chunk = []
-
-    # ----------------------------------------------------------------------
-    # include()
-    #
-    # Implementation of file-inclusion
-    # ----------------------------------------------------------------------
-
-    def include(self,tokens):
-        # Try to extract the filename and then process an include file
-        if not tokens:
-            return
-        if tokens:
-            if tokens[0].value != '<' and tokens[0].type != self.t_STRING:
-                tokens = self.expand_macros(tokens)
-
-            if tokens[0].value == '<':
-                # Include <...>
-                i = 1
-                while i < len(tokens):
-                    if tokens[i].value == '>':
-                        break
-                    i += 1
-                else:
-                    print("Malformed #include <...>")
-                    return
-                filename = "".join([x.value for x in tokens[1:i]])
-                path = self.path + [""] + self.temp_path
-            elif tokens[0].type == self.t_STRING:
-                filename = tokens[0].value[1:-1]
-                path = self.temp_path + [""] + self.path
-            else:
-                print("Malformed #include statement")
-                return
-        for p in path:
-            iname = os.path.join(p,filename)
-            try:
-                data = open(iname,"r").read()
-                dname = os.path.dirname(iname)
-                if dname:
-                    self.temp_path.insert(0,dname)
-                for tok in self.parsegen(data,filename):
-                    yield tok
-                if dname:
-                    del self.temp_path[0]
-                break
-            except IOError:
-                pass
-        else:
-            print("Couldn't find '%s'" % filename)
-
-    # ----------------------------------------------------------------------
-    # define()
-    #
-    # Define a new macro
-    # ----------------------------------------------------------------------
-
-    def define(self,tokens):
-        if isinstance(tokens,(str,unicode)):
-            tokens = self.tokenize(tokens)
-
-        linetok = tokens
-        try:
-            name = linetok[0]
-            if len(linetok) > 1:
-                mtype = linetok[1]
-            else:
-                mtype = None
-            if not mtype:
-                m = Macro(name.value,[])
-                self.macros[name.value] = m
-            elif mtype.type in self.t_WS:
-                # A normal macro
-                m = Macro(name.value,self.tokenstrip(linetok[2:]))
-                self.macros[name.value] = m
-            elif mtype.value == '(':
-                # A macro with arguments
-                tokcount, args, positions = self.collect_args(linetok[1:])
-                variadic = False
-                for a in args:
-                    if variadic:
-                        print("No more arguments may follow a variadic argument")
-                        break
-                    astr = "".join([str(_i.value) for _i in a])
-                    if astr == "...":
-                        variadic = True
-                        a[0].type = self.t_ID
-                        a[0].value = '__VA_ARGS__'
-                        variadic = True
-                        del a[1:]
-                        continue
-                    elif astr[-3:] == "..." and a[0].type == self.t_ID:
-                        variadic = True
-                        del a[1:]
-                        # If, for some reason, "." is part of the identifier, strip off the name for the purposes
-                        # of macro expansion
-                        if a[0].value[-3:] == '...':
-                            a[0].value = a[0].value[:-3]
-                        continue
-                    if len(a) > 1 or a[0].type != self.t_ID:
-                        print("Invalid macro argument")
-                        break
-                else:
-                    mvalue = self.tokenstrip(linetok[1+tokcount:])
-                    i = 0
-                    while i < len(mvalue):
-                        if i+1 < len(mvalue):
-                            if mvalue[i].type in self.t_WS and mvalue[i+1].value == '##':
-                                del mvalue[i]
-                                continue
-                            elif mvalue[i].value == '##' and mvalue[i+1].type in self.t_WS:
-                                del mvalue[i+1]
-                        i += 1
-                    m = Macro(name.value,mvalue,[x[0].value for x in args],variadic)
-                    self.macro_prescan(m)
-                    self.macros[name.value] = m
-            else:
-                print("Bad macro definition")
-        except LookupError:
-            print("Bad macro definition")
-
-    # ----------------------------------------------------------------------
-    # undef()
-    #
-    # Undefine a macro
-    # ----------------------------------------------------------------------
-
-    def undef(self,tokens):
-        id = tokens[0].value
-        try:
-            del self.macros[id]
-        except LookupError:
-            pass
-
-    # ----------------------------------------------------------------------
-    # parse()
-    #
-    # Parse input text.
-    # ----------------------------------------------------------------------
-    def parse(self,input,source=None,ignore={}):
-        self.ignore = ignore
-        self.parser = self.parsegen(input,source)
-        
-    # ----------------------------------------------------------------------
-    # token()
-    #
-    # Method to return individual tokens
-    # ----------------------------------------------------------------------
-    def token(self):
-        try:
-            while True:
-                tok = next(self.parser)
-                if tok.type not in self.ignore: return tok
-        except StopIteration:
-            self.parser = None
-            return None
-
-if __name__ == '__main__':
-    import ply.lex as lex
-    lexer = lex.lex()
-
-    # Run a preprocessor
-    import sys
-    f = open(sys.argv[1])
-    input = f.read()
-
-    p = Preprocessor(lexer)
-    p.parse(input,sys.argv[1])
-    while True:
-        tok = p.token()
-        if not tok: break
-        print(p.source, tok)
-
-
-
-
-    
-
-
-
-
-
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/ctokens.py b/Linux_i686/lib/python3.4/site-packages/pycparser/ply/ctokens.py
deleted file mode 100644
index dd5f102..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/ctokens.py
+++ /dev/null
@@ -1,133 +0,0 @@
-# ----------------------------------------------------------------------
-# ctokens.py
-#
-# Token specifications for symbols in ANSI C and C++.  This file is
-# meant to be used as a library in other tokenizers.
-# ----------------------------------------------------------------------
-
-# Reserved words
-
-tokens = [
-    # Literals (identifier, integer constant, float constant, string constant, char const)
-    'ID', 'TYPEID', 'ICONST', 'FCONST', 'SCONST', 'CCONST',
-
-    # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=)
-    'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD',
-    'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT',
-    'LOR', 'LAND', 'LNOT',
-    'LT', 'LE', 'GT', 'GE', 'EQ', 'NE',
-    
-    # Assignment (=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=)
-    'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL',
-    'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL',
-
-    # Increment/decrement (++,--)
-    'PLUSPLUS', 'MINUSMINUS',
-
-    # Structure dereference (->)
-    'ARROW',
-
-    # Ternary operator (?)
-    'TERNARY',
-    
-    # Delimeters ( ) [ ] { } , . ; :
-    'LPAREN', 'RPAREN',
-    'LBRACKET', 'RBRACKET',
-    'LBRACE', 'RBRACE',
-    'COMMA', 'PERIOD', 'SEMI', 'COLON',
-
-    # Ellipsis (...)
-    'ELLIPSIS',
-]
-    
-# Operators
-t_PLUS             = r'\+'
-t_MINUS            = r'-'
-t_TIMES            = r'\*'
-t_DIVIDE           = r'/'
-t_MODULO           = r'%'
-t_OR               = r'\|'
-t_AND              = r'&'
-t_NOT              = r'~'
-t_XOR              = r'\^'
-t_LSHIFT           = r'<<'
-t_RSHIFT           = r'>>'
-t_LOR              = r'\|\|'
-t_LAND             = r'&&'
-t_LNOT             = r'!'
-t_LT               = r'<'
-t_GT               = r'>'
-t_LE               = r'<='
-t_GE               = r'>='
-t_EQ               = r'=='
-t_NE               = r'!='
-
-# Assignment operators
-
-t_EQUALS           = r'='
-t_TIMESEQUAL       = r'\*='
-t_DIVEQUAL         = r'/='
-t_MODEQUAL         = r'%='
-t_PLUSEQUAL        = r'\+='
-t_MINUSEQUAL       = r'-='
-t_LSHIFTEQUAL      = r'<<='
-t_RSHIFTEQUAL      = r'>>='
-t_ANDEQUAL         = r'&='
-t_OREQUAL          = r'\|='
-t_XOREQUAL         = r'^='
-
-# Increment/decrement
-t_INCREMENT        = r'\+\+'
-t_DECREMENT        = r'--'
-
-# ->
-t_ARROW            = r'->'
-
-# ?
-t_TERNARY          = r'\?'
-
-# Delimeters
-t_LPAREN           = r'\('
-t_RPAREN           = r'\)'
-t_LBRACKET         = r'\['
-t_RBRACKET         = r'\]'
-t_LBRACE           = r'\{'
-t_RBRACE           = r'\}'
-t_COMMA            = r','
-t_PERIOD           = r'\.'
-t_SEMI             = r';'
-t_COLON            = r':'
-t_ELLIPSIS         = r'\.\.\.'
-
-# Identifiers
-t_ID = r'[A-Za-z_][A-Za-z0-9_]*'
-
-# Integer literal
-t_INTEGER = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?'
-
-# Floating literal
-t_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?'
-
-# String literal
-t_STRING = r'\"([^\\\n]|(\\.))*?\"'
-
-# Character constant 'c' or L'c'
-t_CHARACTER = r'(L)?\'([^\\\n]|(\\.))*?\''
-
-# Comment (C-Style)
-def t_COMMENT(t):
-    r'/\*(.|\n)*?\*/'
-    t.lexer.lineno += t.value.count('\n')
-    return t
-
-# Comment (C++-Style)
-def t_CPPCOMMENT(t):
-    r'//.*\n'
-    t.lexer.lineno += 1
-    return t
-
-
-    
-
-
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/lex.py b/Linux_i686/lib/python3.4/site-packages/pycparser/ply/lex.py
deleted file mode 100644
index bd32da9..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/lex.py
+++ /dev/null
@@ -1,1058 +0,0 @@
-# -----------------------------------------------------------------------------
-# ply: lex.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# 
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.  
-# * Redistributions in binary form must reproduce the above copyright notice, 
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.  
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission. 
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-
-__version__    = "3.4"
-__tabversion__ = "3.2"       # Version of table file used
-
-import re, sys, types, copy, os
-
-# This tuple contains known string types
-try:
-    # Python 2.6
-    StringTypes = (types.StringType, types.UnicodeType)
-except AttributeError:
-    # Python 3.0
-    StringTypes = (str, bytes)
-
-# Extract the code attribute of a function. Different implementations
-# are for Python 2/3 compatibility.
-
-if sys.version_info[0] < 3:
-    def func_code(f):
-        return f.func_code
-else:
-    def func_code(f):
-        return f.__code__
-
-# This regular expression is used to match valid token names
-_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$')
-
-# Exception thrown when invalid token encountered and no default error
-# handler is defined.
-
-class LexError(Exception):
-    def __init__(self,message,s):
-         self.args = (message,)
-         self.text = s
-
-# Token class.  This class is used to represent the tokens produced.
-class LexToken(object):
-    def __str__(self):
-        return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos)
-    def __repr__(self):
-        return str(self)
-
-# This object is a stand-in for a logging object created by the 
-# logging module.  
-
-class PlyLogger(object):
-    def __init__(self,f):
-        self.f = f
-    def critical(self,msg,*args,**kwargs):
-        self.f.write((msg % args) + "\n")
-
-    def warning(self,msg,*args,**kwargs):
-        self.f.write("WARNING: "+ (msg % args) + "\n")
-
-    def error(self,msg,*args,**kwargs):
-        self.f.write("ERROR: " + (msg % args) + "\n")
-
-    info = critical
-    debug = critical
-
-# Null logger is used when no output is generated. Does nothing.
-class NullLogger(object):
-    def __getattribute__(self,name):
-        return self
-    def __call__(self,*args,**kwargs):
-        return self
-
-# -----------------------------------------------------------------------------
-#                        === Lexing Engine ===
-#
-# The following Lexer class implements the lexer runtime.   There are only
-# a few public methods and attributes:
-#
-#    input()          -  Store a new string in the lexer
-#    token()          -  Get the next token
-#    clone()          -  Clone the lexer
-#
-#    lineno           -  Current line number
-#    lexpos           -  Current position in the input string
-# -----------------------------------------------------------------------------
-
-class Lexer:
-    def __init__(self):
-        self.lexre = None             # Master regular expression. This is a list of
-                                      # tuples (re,findex) where re is a compiled
-                                      # regular expression and findex is a list
-                                      # mapping regex group numbers to rules
-        self.lexretext = None         # Current regular expression strings
-        self.lexstatere = {}          # Dictionary mapping lexer states to master regexs
-        self.lexstateretext = {}      # Dictionary mapping lexer states to regex strings
-        self.lexstaterenames = {}     # Dictionary mapping lexer states to symbol names
-        self.lexstate = "INITIAL"     # Current lexer state
-        self.lexstatestack = []       # Stack of lexer states
-        self.lexstateinfo = None      # State information
-        self.lexstateignore = {}      # Dictionary of ignored characters for each state
-        self.lexstateerrorf = {}      # Dictionary of error functions for each state
-        self.lexreflags = 0           # Optional re compile flags
-        self.lexdata = None           # Actual input data (as a string)
-        self.lexpos = 0               # Current position in input text
-        self.lexlen = 0               # Length of the input text
-        self.lexerrorf = None         # Error rule (if any)
-        self.lextokens = None         # List of valid tokens
-        self.lexignore = ""           # Ignored characters
-        self.lexliterals = ""         # Literal characters that can be passed through
-        self.lexmodule = None         # Module
-        self.lineno = 1               # Current line number
-        self.lexoptimize = 0          # Optimized mode
-
-    def clone(self,object=None):
-        c = copy.copy(self)
-
-        # If the object parameter has been supplied, it means we are attaching the
-        # lexer to a new object.  In this case, we have to rebind all methods in
-        # the lexstatere and lexstateerrorf tables.
-
-        if object:
-            newtab = { }
-            for key, ritem in self.lexstatere.items():
-                newre = []
-                for cre, findex in ritem:
-                     newfindex = []
-                     for f in findex:
-                         if not f or not f[0]:
-                             newfindex.append(f)
-                             continue
-                         newfindex.append((getattr(object,f[0].__name__),f[1]))
-                newre.append((cre,newfindex))
-                newtab[key] = newre
-            c.lexstatere = newtab
-            c.lexstateerrorf = { }
-            for key, ef in self.lexstateerrorf.items():
-                c.lexstateerrorf[key] = getattr(object,ef.__name__)
-            c.lexmodule = object
-        return c
-
-    # ------------------------------------------------------------
-    # writetab() - Write lexer information to a table file
-    # ------------------------------------------------------------
-    def writetab(self,tabfile,outputdir=""):
-        if isinstance(tabfile,types.ModuleType):
-            return
-        basetabfilename = tabfile.split(".")[-1]
-        filename = os.path.join(outputdir,basetabfilename)+".py"
-        tf = open(filename,"w")
-        tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__))
-        tf.write("_tabversion   = %s\n" % repr(__version__))
-        tf.write("_lextokens    = %s\n" % repr(self.lextokens))
-        tf.write("_lexreflags   = %s\n" % repr(self.lexreflags))
-        tf.write("_lexliterals  = %s\n" % repr(self.lexliterals))
-        tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo))
-
-        tabre = { }
-        # Collect all functions in the initial state
-        initial = self.lexstatere["INITIAL"]
-        initialfuncs = []
-        for part in initial:
-            for f in part[1]:
-                if f and f[0]:
-                    initialfuncs.append(f)
-
-        for key, lre in self.lexstatere.items():
-             titem = []
-             for i in range(len(lre)):
-                  titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i])))
-             tabre[key] = titem
-
-        tf.write("_lexstatere   = %s\n" % repr(tabre))
-        tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore))
-
-        taberr = { }
-        for key, ef in self.lexstateerrorf.items():
-             if ef:
-                  taberr[key] = ef.__name__
-             else:
-                  taberr[key] = None
-        tf.write("_lexstateerrorf = %s\n" % repr(taberr))
-        tf.close()
-
-    # ------------------------------------------------------------
-    # readtab() - Read lexer information from a tab file
-    # ------------------------------------------------------------
-    def readtab(self,tabfile,fdict):
-        if isinstance(tabfile,types.ModuleType):
-            lextab = tabfile
-        else:
-            if sys.version_info[0] < 3:
-                exec("import %s as lextab" % tabfile)
-            else:
-                env = { }
-                exec("import %s as lextab" % tabfile, env,env)
-                lextab = env['lextab']
-
-        if getattr(lextab,"_tabversion","0.0") != __version__:
-            raise ImportError("Inconsistent PLY version")
-
-        self.lextokens      = lextab._lextokens
-        self.lexreflags     = lextab._lexreflags
-        self.lexliterals    = lextab._lexliterals
-        self.lexstateinfo   = lextab._lexstateinfo
-        self.lexstateignore = lextab._lexstateignore
-        self.lexstatere     = { }
-        self.lexstateretext = { }
-        for key,lre in lextab._lexstatere.items():
-             titem = []
-             txtitem = []
-             for i in range(len(lre)):
-                  titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict)))
-                  txtitem.append(lre[i][0])
-             self.lexstatere[key] = titem
-             self.lexstateretext[key] = txtitem
-        self.lexstateerrorf = { }
-        for key,ef in lextab._lexstateerrorf.items():
-             self.lexstateerrorf[key] = fdict[ef]
-        self.begin('INITIAL')
-
-    # ------------------------------------------------------------
-    # input() - Push a new string into the lexer
-    # ------------------------------------------------------------
-    def input(self,s):
-        # Pull off the first character to see if s looks like a string
-        c = s[:1]
-        if not isinstance(c,StringTypes):
-            raise ValueError("Expected a string")
-        self.lexdata = s
-        self.lexpos = 0
-        self.lexlen = len(s)
-
-    # ------------------------------------------------------------
-    # begin() - Changes the lexing state
-    # ------------------------------------------------------------
-    def begin(self,state):
-        if not state in self.lexstatere:
-            raise ValueError("Undefined state")
-        self.lexre = self.lexstatere[state]
-        self.lexretext = self.lexstateretext[state]
-        self.lexignore = self.lexstateignore.get(state,"")
-        self.lexerrorf = self.lexstateerrorf.get(state,None)
-        self.lexstate = state
-
-    # ------------------------------------------------------------
-    # push_state() - Changes the lexing state and saves old on stack
-    # ------------------------------------------------------------
-    def push_state(self,state):
-        self.lexstatestack.append(self.lexstate)
-        self.begin(state)
-
-    # ------------------------------------------------------------
-    # pop_state() - Restores the previous state
-    # ------------------------------------------------------------
-    def pop_state(self):
-        self.begin(self.lexstatestack.pop())
-
-    # ------------------------------------------------------------
-    # current_state() - Returns the current lexing state
-    # ------------------------------------------------------------
-    def current_state(self):
-        return self.lexstate
-
-    # ------------------------------------------------------------
-    # skip() - Skip ahead n characters
-    # ------------------------------------------------------------
-    def skip(self,n):
-        self.lexpos += n
-
-    # ------------------------------------------------------------
-    # opttoken() - Return the next token from the Lexer
-    #
-    # Note: This function has been carefully implemented to be as fast
-    # as possible.  Don't make changes unless you really know what
-    # you are doing
-    # ------------------------------------------------------------
-    def token(self):
-        # Make local copies of frequently referenced attributes
-        lexpos    = self.lexpos
-        lexlen    = self.lexlen
-        lexignore = self.lexignore
-        lexdata   = self.lexdata
-
-        while lexpos < lexlen:
-            # This code provides some short-circuit code for whitespace, tabs, and other ignored characters
-            if lexdata[lexpos] in lexignore:
-                lexpos += 1
-                continue
-
-            # Look for a regular expression match
-            for lexre,lexindexfunc in self.lexre:
-                m = lexre.match(lexdata,lexpos)
-                if not m: continue
-
-                # Create a token for return
-                tok = LexToken()
-                tok.value = m.group()
-                tok.lineno = self.lineno
-                tok.lexpos = lexpos
-
-                i = m.lastindex
-                func,tok.type = lexindexfunc[i]
-
-                if not func:
-                   # If no token type was set, it's an ignored token
-                   if tok.type:
-                      self.lexpos = m.end()
-                      return tok
-                   else:
-                      lexpos = m.end()
-                      break
-
-                lexpos = m.end()
-
-                # If token is processed by a function, call it
-
-                tok.lexer = self      # Set additional attributes useful in token rules
-                self.lexmatch = m
-                self.lexpos = lexpos
-
-                newtok = func(tok)
-
-                # Every function must return a token, if nothing, we just move to next token
-                if not newtok:
-                    lexpos    = self.lexpos         # This is here in case user has updated lexpos.
-                    lexignore = self.lexignore      # This is here in case there was a state change
-                    break
-
-                # Verify type of the token.  If not in the token map, raise an error
-                if not self.lexoptimize:
-                    if not newtok.type in self.lextokens:
-                        raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % (
-                            func_code(func).co_filename, func_code(func).co_firstlineno,
-                            func.__name__, newtok.type),lexdata[lexpos:])
-
-                return newtok
-            else:
-                # No match, see if in literals
-                if lexdata[lexpos] in self.lexliterals:
-                    tok = LexToken()
-                    tok.value = lexdata[lexpos]
-                    tok.lineno = self.lineno
-                    tok.type = tok.value
-                    tok.lexpos = lexpos
-                    self.lexpos = lexpos + 1
-                    return tok
-
-                # No match. Call t_error() if defined.
-                if self.lexerrorf:
-                    tok = LexToken()
-                    tok.value = self.lexdata[lexpos:]
-                    tok.lineno = self.lineno
-                    tok.type = "error"
-                    tok.lexer = self
-                    tok.lexpos = lexpos
-                    self.lexpos = lexpos
-                    newtok = self.lexerrorf(tok)
-                    if lexpos == self.lexpos:
-                        # Error method didn't change text position at all. This is an error.
-                        raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:])
-                    lexpos = self.lexpos
-                    if not newtok: continue
-                    return newtok
-
-                self.lexpos = lexpos
-                raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:])
-
-        self.lexpos = lexpos + 1
-        if self.lexdata is None:
-             raise RuntimeError("No input string given with input()")
-        return None
-
-    # Iterator interface
-    def __iter__(self):
-        return self
-
-    def next(self):
-        t = self.token()
-        if t is None:
-            raise StopIteration
-        return t
-
-    __next__ = next
-
-# -----------------------------------------------------------------------------
-#                           ==== Lex Builder ===
-#
-# The functions and classes below are used to collect lexing information
-# and build a Lexer object from it.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# get_caller_module_dict()
-#
-# This function returns a dictionary containing all of the symbols defined within
-# a caller further down the call stack.  This is used to get the environment
-# associated with the yacc() call if none was provided.
-# -----------------------------------------------------------------------------
-
-def get_caller_module_dict(levels):
-    try:
-        raise RuntimeError
-    except RuntimeError:
-        e,b,t = sys.exc_info()
-        f = t.tb_frame
-        while levels > 0:
-            f = f.f_back                   
-            levels -= 1
-        ldict = f.f_globals.copy()
-        if f.f_globals != f.f_locals:
-            ldict.update(f.f_locals)
-
-        return ldict
-
-# -----------------------------------------------------------------------------
-# _funcs_to_names()
-#
-# Given a list of regular expression functions, this converts it to a list
-# suitable for output to a table file
-# -----------------------------------------------------------------------------
-
-def _funcs_to_names(funclist,namelist):
-    result = []
-    for f,name in zip(funclist,namelist):
-         if f and f[0]:
-             result.append((name, f[1]))
-         else:
-             result.append(f)
-    return result
-
-# -----------------------------------------------------------------------------
-# _names_to_funcs()
-#
-# Given a list of regular expression function names, this converts it back to
-# functions.
-# -----------------------------------------------------------------------------
-
-def _names_to_funcs(namelist,fdict):
-     result = []
-     for n in namelist:
-          if n and n[0]:
-              result.append((fdict[n[0]],n[1]))
-          else:
-              result.append(n)
-     return result
-
-# -----------------------------------------------------------------------------
-# _form_master_re()
-#
-# This function takes a list of all of the regex components and attempts to
-# form the master regular expression.  Given limitations in the Python re
-# module, it may be necessary to break the master regex into separate expressions.
-# -----------------------------------------------------------------------------
-
-def _form_master_re(relist,reflags,ldict,toknames):
-    if not relist: return []
-    regex = "|".join(relist)
-    try:
-        lexre = re.compile(regex,re.VERBOSE | reflags)
-
-        # Build the index to function map for the matching engine
-        lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1)
-        lexindexnames = lexindexfunc[:]
-
-        for f,i in lexre.groupindex.items():
-            handle = ldict.get(f,None)
-            if type(handle) in (types.FunctionType, types.MethodType):
-                lexindexfunc[i] = (handle,toknames[f])
-                lexindexnames[i] = f
-            elif handle is not None:
-                lexindexnames[i] = f
-                if f.find("ignore_") > 0:
-                    lexindexfunc[i] = (None,None)
-                else:
-                    lexindexfunc[i] = (None, toknames[f])
-        
-        return [(lexre,lexindexfunc)],[regex],[lexindexnames]
-    except Exception:
-        m = int(len(relist)/2)
-        if m == 0: m = 1
-        llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames)
-        rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames)
-        return llist+rlist, lre+rre, lnames+rnames
-
-# -----------------------------------------------------------------------------
-# def _statetoken(s,names)
-#
-# Given a declaration name s of the form "t_" and a dictionary whose keys are
-# state names, this function returns a tuple (states,tokenname) where states
-# is a tuple of state names and tokenname is the name of the token.  For example,
-# calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM')
-# -----------------------------------------------------------------------------
-
-def _statetoken(s,names):
-    nonstate = 1
-    parts = s.split("_")
-    for i in range(1,len(parts)):
-         if not parts[i] in names and parts[i] != 'ANY': break
-    if i > 1:
-       states = tuple(parts[1:i])
-    else:
-       states = ('INITIAL',)
-
-    if 'ANY' in states:
-       states = tuple(names)
-
-    tokenname = "_".join(parts[i:])
-    return (states,tokenname)
-
-
-# -----------------------------------------------------------------------------
-# LexerReflect()
-#
-# This class represents information needed to build a lexer as extracted from a
-# user's input file.
-# -----------------------------------------------------------------------------
-class LexerReflect(object):
-    def __init__(self,ldict,log=None,reflags=0):
-        self.ldict      = ldict
-        self.error_func = None
-        self.tokens     = []
-        self.reflags    = reflags
-        self.stateinfo  = { 'INITIAL' : 'inclusive'}
-        self.files      = {}
-        self.error      = 0
-
-        if log is None:
-            self.log = PlyLogger(sys.stderr)
-        else:
-            self.log = log
-
-    # Get all of the basic information
-    def get_all(self):
-        self.get_tokens()
-        self.get_literals()
-        self.get_states()
-        self.get_rules()
-        
-    # Validate all of the information
-    def validate_all(self):
-        self.validate_tokens()
-        self.validate_literals()
-        self.validate_rules()
-        return self.error
-
-    # Get the tokens map
-    def get_tokens(self):
-        tokens = self.ldict.get("tokens",None)
-        if not tokens:
-            self.log.error("No token list is defined")
-            self.error = 1
-            return
-
-        if not isinstance(tokens,(list, tuple)):
-            self.log.error("tokens must be a list or tuple")
-            self.error = 1
-            return
-        
-        if not tokens:
-            self.log.error("tokens is empty")
-            self.error = 1
-            return
-
-        self.tokens = tokens
-
-    # Validate the tokens
-    def validate_tokens(self):
-        terminals = {}
-        for n in self.tokens:
-            if not _is_identifier.match(n):
-                self.log.error("Bad token name '%s'",n)
-                self.error = 1
-            if n in terminals:
-                self.log.warning("Token '%s' multiply defined", n)
-            terminals[n] = 1
-
-    # Get the literals specifier
-    def get_literals(self):
-        self.literals = self.ldict.get("literals","")
-
-    # Validate literals
-    def validate_literals(self):
-        try:
-            for c in self.literals:
-                if not isinstance(c,StringTypes) or len(c) > 1:
-                    self.log.error("Invalid literal %s. Must be a single character", repr(c))
-                    self.error = 1
-                    continue
-
-        except TypeError:
-            self.log.error("Invalid literals specification. literals must be a sequence of characters")
-            self.error = 1
-
-    def get_states(self):
-        self.states = self.ldict.get("states",None)
-        # Build statemap
-        if self.states:
-             if not isinstance(self.states,(tuple,list)):
-                  self.log.error("states must be defined as a tuple or list")
-                  self.error = 1
-             else:
-                  for s in self.states:
-                        if not isinstance(s,tuple) or len(s) != 2:
-                               self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s))
-                               self.error = 1
-                               continue
-                        name, statetype = s
-                        if not isinstance(name,StringTypes):
-                               self.log.error("State name %s must be a string", repr(name))
-                               self.error = 1
-                               continue
-                        if not (statetype == 'inclusive' or statetype == 'exclusive'):
-                               self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name)
-                               self.error = 1
-                               continue
-                        if name in self.stateinfo:
-                               self.log.error("State '%s' already defined",name)
-                               self.error = 1
-                               continue
-                        self.stateinfo[name] = statetype
-
-    # Get all of the symbols with a t_ prefix and sort them into various
-    # categories (functions, strings, error functions, and ignore characters)
-
-    def get_rules(self):
-        tsymbols = [f for f in self.ldict if f[:2] == 't_' ]
-
-        # Now build up a list of functions and a list of strings
-
-        self.toknames = { }        # Mapping of symbols to token names
-        self.funcsym =  { }        # Symbols defined as functions
-        self.strsym =   { }        # Symbols defined as strings
-        self.ignore   = { }        # Ignore strings by state
-        self.errorf   = { }        # Error functions by state
-
-        for s in self.stateinfo:
-             self.funcsym[s] = []
-             self.strsym[s] = []
-
-        if len(tsymbols) == 0:
-            self.log.error("No rules of the form t_rulename are defined")
-            self.error = 1
-            return
-
-        for f in tsymbols:
-            t = self.ldict[f]
-            states, tokname = _statetoken(f,self.stateinfo)
-            self.toknames[f] = tokname
-
-            if hasattr(t,"__call__"):
-                if tokname == 'error':
-                    for s in states:
-                        self.errorf[s] = t
-                elif tokname == 'ignore':
-                    line = func_code(t).co_firstlineno
-                    file = func_code(t).co_filename
-                    self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__)
-                    self.error = 1
-                else:
-                    for s in states: 
-                        self.funcsym[s].append((f,t))
-            elif isinstance(t, StringTypes):
-                if tokname == 'ignore':
-                    for s in states:
-                        self.ignore[s] = t
-                    if "\\" in t:
-                        self.log.warning("%s contains a literal backslash '\\'",f)
-
-                elif tokname == 'error':
-                    self.log.error("Rule '%s' must be defined as a function", f)
-                    self.error = 1
-                else:
-                    for s in states: 
-                        self.strsym[s].append((f,t))
-            else:
-                self.log.error("%s not defined as a function or string", f)
-                self.error = 1
-
-        # Sort the functions by line number
-        for f in self.funcsym.values():
-            if sys.version_info[0] < 3:
-                f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno))
-            else:
-                # Python 3.0
-                f.sort(key=lambda x: func_code(x[1]).co_firstlineno)
-
-        # Sort the strings by regular expression length
-        for s in self.strsym.values():
-            if sys.version_info[0] < 3:
-                s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1])))
-            else:
-                # Python 3.0
-                s.sort(key=lambda x: len(x[1]),reverse=True)
-
-    # Validate all of the t_rules collected 
-    def validate_rules(self):
-        for state in self.stateinfo:
-            # Validate all rules defined by functions
-
-            
-
-            for fname, f in self.funcsym[state]:
-                line = func_code(f).co_firstlineno
-                file = func_code(f).co_filename
-                self.files[file] = 1
-
-                tokname = self.toknames[fname]
-                if isinstance(f, types.MethodType):
-                    reqargs = 2
-                else:
-                    reqargs = 1
-                nargs = func_code(f).co_argcount
-                if nargs > reqargs:
-                    self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                if nargs < reqargs:
-                    self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                if not f.__doc__:
-                    self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                try:
-                    c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags)
-                    if c.match(""):
-                        self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__)
-                        self.error = 1
-                except re.error:
-                    _etype, e, _etrace = sys.exc_info()
-                    self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e)
-                    if '#' in f.__doc__:
-                        self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__)
-                    self.error = 1
-
-            # Validate all rules defined by strings
-            for name,r in self.strsym[state]:
-                tokname = self.toknames[name]
-                if tokname == 'error':
-                    self.log.error("Rule '%s' must be defined as a function", name)
-                    self.error = 1
-                    continue
-
-                if not tokname in self.tokens and tokname.find("ignore_") < 0:
-                    self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname)
-                    self.error = 1
-                    continue
-
-                try:
-                    c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags)
-                    if (c.match("")):
-                         self.log.error("Regular expression for rule '%s' matches empty string",name)
-                         self.error = 1
-                except re.error:
-                    _etype, e, _etrace = sys.exc_info()
-                    self.log.error("Invalid regular expression for rule '%s'. %s",name,e)
-                    if '#' in r:
-                         self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name)
-                    self.error = 1
-
-            if not self.funcsym[state] and not self.strsym[state]:
-                self.log.error("No rules defined for state '%s'",state)
-                self.error = 1
-
-            # Validate the error function
-            efunc = self.errorf.get(state,None)
-            if efunc:
-                f = efunc
-                line = func_code(f).co_firstlineno
-                file = func_code(f).co_filename
-                self.files[file] = 1
-
-                if isinstance(f, types.MethodType):
-                    reqargs = 2
-                else:
-                    reqargs = 1
-                nargs = func_code(f).co_argcount
-                if nargs > reqargs:
-                    self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__)
-                    self.error = 1
-
-                if nargs < reqargs:
-                    self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__)
-                    self.error = 1
-
-        for f in self.files:
-            self.validate_file(f)
-
-
-    # -----------------------------------------------------------------------------
-    # validate_file()
-    #
-    # This checks to see if there are duplicated t_rulename() functions or strings
-    # in the parser input file.  This is done using a simple regular expression
-    # match on each line in the given file.  
-    # -----------------------------------------------------------------------------
-
-    def validate_file(self,filename):
-        import os.path
-        base,ext = os.path.splitext(filename)
-        if ext != '.py': return         # No idea what the file is. Return OK
-
-        try:
-            f = open(filename)
-            lines = f.readlines()
-            f.close()
-        except IOError:
-            return                      # Couldn't find the file.  Don't worry about it
-
-        fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(')
-        sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=')
-
-        counthash = { }
-        linen = 1
-        for l in lines:
-            m = fre.match(l)
-            if not m:
-                m = sre.match(l)
-            if m:
-                name = m.group(1)
-                prev = counthash.get(name)
-                if not prev:
-                    counthash[name] = linen
-                else:
-                    self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev)
-                    self.error = 1
-            linen += 1
-            
-# -----------------------------------------------------------------------------
-# lex(module)
-#
-# Build all of the regular expression rules from definitions in the supplied module
-# -----------------------------------------------------------------------------
-def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None):
-    global lexer
-    ldict = None
-    stateinfo  = { 'INITIAL' : 'inclusive'}
-    lexobj = Lexer()
-    lexobj.lexoptimize = optimize
-    global token,input
-
-    if errorlog is None:
-        errorlog = PlyLogger(sys.stderr)
-
-    if debug:
-        if debuglog is None:
-            debuglog = PlyLogger(sys.stderr)
-
-    # Get the module dictionary used for the lexer
-    if object: module = object
-
-    if module:
-        _items = [(k,getattr(module,k)) for k in dir(module)]
-        ldict = dict(_items)
-    else:
-        ldict = get_caller_module_dict(2)
-
-    # Collect parser information from the dictionary
-    linfo = LexerReflect(ldict,log=errorlog,reflags=reflags)
-    linfo.get_all()
-    if not optimize:
-        if linfo.validate_all():
-            raise SyntaxError("Can't build lexer")
-
-    if optimize and lextab:
-        try:
-            lexobj.readtab(lextab,ldict)
-            token = lexobj.token
-            input = lexobj.input
-            lexer = lexobj
-            return lexobj
-
-        except ImportError:
-            pass
-
-    # Dump some basic debugging information
-    if debug:
-        debuglog.info("lex: tokens   = %r", linfo.tokens)
-        debuglog.info("lex: literals = %r", linfo.literals)
-        debuglog.info("lex: states   = %r", linfo.stateinfo)
-
-    # Build a dictionary of valid token names
-    lexobj.lextokens = { }
-    for n in linfo.tokens:
-        lexobj.lextokens[n] = 1
-
-    # Get literals specification
-    if isinstance(linfo.literals,(list,tuple)):
-        lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals)
-    else:
-        lexobj.lexliterals = linfo.literals
-
-    # Get the stateinfo dictionary
-    stateinfo = linfo.stateinfo
-
-    regexs = { }
-    # Build the master regular expressions
-    for state in stateinfo:
-        regex_list = []
-
-        # Add rules defined by functions first
-        for fname, f in linfo.funcsym[state]:
-            line = func_code(f).co_firstlineno
-            file = func_code(f).co_filename
-            regex_list.append("(?P<%s>%s)" % (fname,f.__doc__))
-            if debug:
-                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state)
-
-        # Now add all of the simple rules
-        for name,r in linfo.strsym[state]:
-            regex_list.append("(?P<%s>%s)" % (name,r))
-            if debug:
-                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state)
-
-        regexs[state] = regex_list
-
-    # Build the master regular expressions
-
-    if debug:
-        debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====")
-
-    for state in regexs:
-        lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames)
-        lexobj.lexstatere[state] = lexre
-        lexobj.lexstateretext[state] = re_text
-        lexobj.lexstaterenames[state] = re_names
-        if debug:
-            for i in range(len(re_text)):
-                debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i])
-
-    # For inclusive states, we need to add the regular expressions from the INITIAL state
-    for state,stype in stateinfo.items():
-        if state != "INITIAL" and stype == 'inclusive':
-             lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL'])
-             lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL'])
-             lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL'])
-
-    lexobj.lexstateinfo = stateinfo
-    lexobj.lexre = lexobj.lexstatere["INITIAL"]
-    lexobj.lexretext = lexobj.lexstateretext["INITIAL"]
-    lexobj.lexreflags = reflags
-
-    # Set up ignore variables
-    lexobj.lexstateignore = linfo.ignore
-    lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","")
-
-    # Set up error functions
-    lexobj.lexstateerrorf = linfo.errorf
-    lexobj.lexerrorf = linfo.errorf.get("INITIAL",None)
-    if not lexobj.lexerrorf:
-        errorlog.warning("No t_error rule is defined")
-
-    # Check state information for ignore and error rules
-    for s,stype in stateinfo.items():
-        if stype == 'exclusive':
-              if not s in linfo.errorf:
-                   errorlog.warning("No error rule is defined for exclusive state '%s'", s)
-              if not s in linfo.ignore and lexobj.lexignore:
-                   errorlog.warning("No ignore rule is defined for exclusive state '%s'", s)
-        elif stype == 'inclusive':
-              if not s in linfo.errorf:
-                   linfo.errorf[s] = linfo.errorf.get("INITIAL",None)
-              if not s in linfo.ignore:
-                   linfo.ignore[s] = linfo.ignore.get("INITIAL","")
-
-    # Create global versions of the token() and input() functions
-    token = lexobj.token
-    input = lexobj.input
-    lexer = lexobj
-
-    # If in optimize mode, we write the lextab
-    if lextab and optimize:
-        lexobj.writetab(lextab,outputdir)
-
-    return lexobj
-
-# -----------------------------------------------------------------------------
-# runmain()
-#
-# This runs the lexer as a main program
-# -----------------------------------------------------------------------------
-
-def runmain(lexer=None,data=None):
-    if not data:
-        try:
-            filename = sys.argv[1]
-            f = open(filename)
-            data = f.read()
-            f.close()
-        except IndexError:
-            sys.stdout.write("Reading from standard input (type EOF to end):\n")
-            data = sys.stdin.read()
-
-    if lexer:
-        _input = lexer.input
-    else:
-        _input = input
-    _input(data)
-    if lexer:
-        _token = lexer.token
-    else:
-        _token = token
-
-    while 1:
-        tok = _token()
-        if not tok: break
-        sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos))
-
-# -----------------------------------------------------------------------------
-# @TOKEN(regex)
-#
-# This decorator function can be used to set the regex expression on a function
-# when its docstring might need to be set in an alternative way
-# -----------------------------------------------------------------------------
-
-def TOKEN(r):
-    def set_doc(f):
-        if hasattr(r,"__call__"):
-            f.__doc__ = r.__doc__
-        else:
-            f.__doc__ = r
-        return f
-    return set_doc
-
-# Alternative spelling of the TOKEN decorator
-Token = TOKEN
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/yacc.py b/Linux_i686/lib/python3.4/site-packages/pycparser/ply/yacc.py
deleted file mode 100644
index f70439e..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/ply/yacc.py
+++ /dev/null
@@ -1,3276 +0,0 @@
-# -----------------------------------------------------------------------------
-# ply: yacc.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# 
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.  
-# * Redistributions in binary form must reproduce the above copyright notice, 
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.  
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission. 
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-#
-# This implements an LR parser that is constructed from grammar rules defined
-# as Python functions. The grammer is specified by supplying the BNF inside
-# Python documentation strings.  The inspiration for this technique was borrowed
-# from John Aycock's Spark parsing system.  PLY might be viewed as cross between
-# Spark and the GNU bison utility.
-#
-# The current implementation is only somewhat object-oriented. The
-# LR parser itself is defined in terms of an object (which allows multiple
-# parsers to co-exist).  However, most of the variables used during table
-# construction are defined in terms of global variables.  Users shouldn't
-# notice unless they are trying to define multiple parsers at the same
-# time using threads (in which case they should have their head examined).
-#
-# This implementation supports both SLR and LALR(1) parsing.  LALR(1)
-# support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu),
-# using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles,
-# Techniques, and Tools" (The Dragon Book).  LALR(1) has since been replaced
-# by the more efficient DeRemer and Pennello algorithm.
-#
-# :::::::: WARNING :::::::
-#
-# Construction of LR parsing tables is fairly complicated and expensive.
-# To make this module run fast, a *LOT* of work has been put into
-# optimization---often at the expensive of readability and what might
-# consider to be good Python "coding style."   Modify the code at your
-# own risk!
-# ----------------------------------------------------------------------------
-
-__version__    = "3.4"
-__tabversion__ = "3.2"       # Table version
-
-#-----------------------------------------------------------------------------
-#                     === User configurable parameters ===
-#
-# Change these to modify the default behavior of yacc (if you wish)
-#-----------------------------------------------------------------------------
-
-yaccdebug   = 1                # Debugging mode.  If set, yacc generates a
-                               # a 'parser.out' file in the current directory
-
-debug_file  = 'parser.out'     # Default name of the debugging file
-tab_module  = 'parsetab'       # Default name of the table module
-default_lr  = 'LALR'           # Default LR table generation method
-
-error_count = 3                # Number of symbols that must be shifted to leave recovery mode
-
-yaccdevel   = 0                # Set to True if developing yacc.  This turns off optimized
-                               # implementations of certain functions.
-
-resultlimit = 40               # Size limit of results when running in debug mode.
-
-pickle_protocol = 0            # Protocol to use when writing pickle files
-
-import re, types, sys, os.path
-
-# Compatibility function for python 2.6/3.0
-if sys.version_info[0] < 3:
-    def func_code(f):
-        return f.func_code
-else:
-    def func_code(f):
-        return f.__code__
-
-# Compatibility
-try:
-    MAXINT = sys.maxint
-except AttributeError:
-    MAXINT = sys.maxsize
-
-# Python 2.x/3.0 compatibility.
-def load_ply_lex():
-    if sys.version_info[0] < 3:
-        import lex
-    else:
-        import ply.lex as lex
-    return lex
-
-# This object is a stand-in for a logging object created by the 
-# logging module.   PLY will use this by default to create things
-# such as the parser.out file.  If a user wants more detailed
-# information, they can create their own logging object and pass
-# it into PLY.
-
-class PlyLogger(object):
-    def __init__(self,f):
-        self.f = f
-    def debug(self,msg,*args,**kwargs):
-        self.f.write((msg % args) + "\n")
-    info     = debug
-
-    def warning(self,msg,*args,**kwargs):
-        self.f.write("WARNING: "+ (msg % args) + "\n")
-
-    def error(self,msg,*args,**kwargs):
-        self.f.write("ERROR: " + (msg % args) + "\n")
-
-    critical = debug
-
-# Null logger is used when no output is generated. Does nothing.
-class NullLogger(object):
-    def __getattribute__(self,name):
-        return self
-    def __call__(self,*args,**kwargs):
-        return self
-        
-# Exception raised for yacc-related errors
-class YaccError(Exception):   pass
-
-# Format the result message that the parser produces when running in debug mode.
-def format_result(r):
-    repr_str = repr(r)
-    if '\n' in repr_str: repr_str = repr(repr_str)
-    if len(repr_str) > resultlimit:
-        repr_str = repr_str[:resultlimit]+" ..."
-    result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str)
-    return result
-
-
-# Format stack entries when the parser is running in debug mode
-def format_stack_entry(r):
-    repr_str = repr(r)
-    if '\n' in repr_str: repr_str = repr(repr_str)
-    if len(repr_str) < 16:
-        return repr_str
-    else:
-        return "<%s @ 0x%x>" % (type(r).__name__,id(r))
-
-#-----------------------------------------------------------------------------
-#                        ===  LR Parsing Engine ===
-#
-# The following classes are used for the LR parser itself.  These are not
-# used during table construction and are independent of the actual LR
-# table generation algorithm
-#-----------------------------------------------------------------------------
-
-# This class is used to hold non-terminal grammar symbols during parsing.
-# It normally has the following attributes set:
-#        .type       = Grammar symbol type
-#        .value      = Symbol value
-#        .lineno     = Starting line number
-#        .endlineno  = Ending line number (optional, set automatically)
-#        .lexpos     = Starting lex position
-#        .endlexpos  = Ending lex position (optional, set automatically)
-
-class YaccSymbol:
-    def __str__(self):    return self.type
-    def __repr__(self):   return str(self)
-
-# This class is a wrapper around the objects actually passed to each
-# grammar rule.   Index lookup and assignment actually assign the
-# .value attribute of the underlying YaccSymbol object.
-# The lineno() method returns the line number of a given
-# item (or 0 if not defined).   The linespan() method returns
-# a tuple of (startline,endline) representing the range of lines
-# for a symbol.  The lexspan() method returns a tuple (lexpos,endlexpos)
-# representing the range of positional information for a symbol.
-
-class YaccProduction:
-    def __init__(self,s,stack=None):
-        self.slice = s
-        self.stack = stack
-        self.lexer = None
-        self.parser= None
-    def __getitem__(self,n):
-        if n >= 0: return self.slice[n].value
-        else: return self.stack[n].value
-
-    def __setitem__(self,n,v):
-        self.slice[n].value = v
-
-    def __getslice__(self,i,j):
-        return [s.value for s in self.slice[i:j]]
-
-    def __len__(self):
-        return len(self.slice)
-
-    def lineno(self,n):
-        return getattr(self.slice[n],"lineno",0)
-
-    def set_lineno(self,n,lineno):
-        self.slice[n].lineno = lineno
-
-    def linespan(self,n):
-        startline = getattr(self.slice[n],"lineno",0)
-        endline = getattr(self.slice[n],"endlineno",startline)
-        return startline,endline
-
-    def lexpos(self,n):
-        return getattr(self.slice[n],"lexpos",0)
-
-    def lexspan(self,n):
-        startpos = getattr(self.slice[n],"lexpos",0)
-        endpos = getattr(self.slice[n],"endlexpos",startpos)
-        return startpos,endpos
-
-    def error(self):
-       raise SyntaxError
-
-
-# -----------------------------------------------------------------------------
-#                               == LRParser ==
-#
-# The LR Parsing engine.
-# -----------------------------------------------------------------------------
-
-class LRParser:
-    def __init__(self,lrtab,errorf):
-        self.productions = lrtab.lr_productions
-        self.action      = lrtab.lr_action
-        self.goto        = lrtab.lr_goto
-        self.errorfunc   = errorf
-
-    def errok(self):
-        self.errorok     = 1
-
-    def restart(self):
-        del self.statestack[:]
-        del self.symstack[:]
-        sym = YaccSymbol()
-        sym.type = '$end'
-        self.symstack.append(sym)
-        self.statestack.append(0)
-
-    def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        if debug or yaccdevel:
-            if isinstance(debug,int):
-                debug = PlyLogger(sys.stderr)
-            return self.parsedebug(input,lexer,debug,tracking,tokenfunc)
-        elif tracking:
-            return self.parseopt(input,lexer,debug,tracking,tokenfunc)
-        else:
-            return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
-        
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parsedebug().
-    #
-    # This is the debugging enabled version of parse().  All changes made to the
-    # parsing engine should be made here.   For the non-debugging version,
-    # copy this code to a method parseopt() and delete all of the sections
-    # enclosed in:
-    #
-    #      #--! DEBUG
-    #      statements
-    #      #--! DEBUG
-    #
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-    def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # --! DEBUG
-        debug.info("PLY: PARSE DEBUG START")
-        # --! DEBUG
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = "$end"
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            # --! DEBUG
-            debug.debug('')
-            debug.debug('State  : %s', state)
-            # --! DEBUG
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = "$end"
-
-            # --! DEBUG
-            debug.debug('Stack  : %s',
-                        ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
-            # --! DEBUG
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-                    
-                    # --! DEBUG
-                    debug.debug("Action : Shift and goto state %s", t)
-                    # --! DEBUG
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    # --! DEBUG
-                    if plen:
-                        debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t)
-                    else:
-                        debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t)
-                        
-                    # --! DEBUG
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # --! TRACKING
-                        if tracking:
-                           t1 = targ[1]
-                           sym.lineno = t1.lineno
-                           sym.lexpos = t1.lexpos
-                           t1 = targ[-1]
-                           sym.endlineno = getattr(t1,"endlineno",t1.lineno)
-                           sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos)
-
-                        # --! TRACKING
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            # --! DEBUG
-                            debug.info("Result : %s", format_result(pslice[0]))
-                            # --! DEBUG
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        # --! TRACKING
-                        if tracking:
-                           sym.lineno = lexer.lineno
-                           sym.lexpos = lexer.lexpos
-                        # --! TRACKING
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            # --! DEBUG
-                            debug.info("Result : %s", format_result(pslice[0]))
-                            # --! DEBUG
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    result = getattr(n,"value",None)
-                    # --! DEBUG
-                    debug.info("Done   : Returning %s", format_result(result))
-                    debug.info("PLY: PARSE DEBUG END")
-                    # --! DEBUG
-                    return result
-
-            if t == None:
-
-                # --! DEBUG
-                debug.error('Error  : %s',
-                            ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
-                # --! DEBUG
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == "$end":
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != "$end":
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == "$end":
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parseopt().
-    #
-    # Optimized version of parse() method.  DO NOT EDIT THIS CODE DIRECTLY.
-    # Edit the debug version above, then copy any modifications to the method
-    # below while removing #--! DEBUG sections.
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-    def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-        
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = '$end'
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = '$end'
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # --! TRACKING
-                        if tracking:
-                           t1 = targ[1]
-                           sym.lineno = t1.lineno
-                           sym.lexpos = t1.lexpos
-                           t1 = targ[-1]
-                           sym.endlineno = getattr(t1,"endlineno",t1.lineno)
-                           sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos)
-
-                        # --! TRACKING
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        # --! TRACKING
-                        if tracking:
-                           sym.lineno = lexer.lineno
-                           sym.lexpos = lexer.lexpos
-                        # --! TRACKING
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    return getattr(n,"value",None)
-
-            if t == None:
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == '$end':
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != '$end':
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == '$end':
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parseopt_notrack().
-    #
-    # Optimized version of parseopt() with line number tracking removed. 
-    # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove
-    # code in the #--! TRACKING sections
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-    def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-        
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = '$end'
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = '$end'
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    return getattr(n,"value",None)
-
-            if t == None:
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == '$end':
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != '$end':
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == '$end':
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-# -----------------------------------------------------------------------------
-#                          === Grammar Representation ===
-#
-# The following functions, classes, and variables are used to represent and
-# manipulate the rules that make up a grammar. 
-# -----------------------------------------------------------------------------
-
-import re
-
-# regex matching identifiers
-_is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$')
-
-# -----------------------------------------------------------------------------
-# class Production:
-#
-# This class stores the raw information about a single production or grammar rule.
-# A grammar rule refers to a specification such as this:
-#
-#       expr : expr PLUS term 
-#
-# Here are the basic attributes defined on all productions
-#
-#       name     - Name of the production.  For example 'expr'
-#       prod     - A list of symbols on the right side ['expr','PLUS','term']
-#       prec     - Production precedence level
-#       number   - Production number.
-#       func     - Function that executes on reduce
-#       file     - File where production function is defined
-#       lineno   - Line number where production function is defined
-#
-# The following attributes are defined or optional.
-#
-#       len       - Length of the production (number of symbols on right hand side)
-#       usyms     - Set of unique symbols found in the production
-# -----------------------------------------------------------------------------
-
-class Production(object):
-    reduced = 0
-    def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0):
-        self.name     = name
-        self.prod     = tuple(prod)
-        self.number   = number
-        self.func     = func
-        self.callable = None
-        self.file     = file
-        self.line     = line
-        self.prec     = precedence
-
-        # Internal settings used during table construction
-        
-        self.len  = len(self.prod)   # Length of the production
-
-        # Create a list of unique production symbols used in the production
-        self.usyms = [ ]             
-        for s in self.prod:
-            if s not in self.usyms:
-                self.usyms.append(s)
-
-        # List of all LR items for the production
-        self.lr_items = []
-        self.lr_next = None
-
-        # Create a string representation
-        if self.prod:
-            self.str = "%s -> %s" % (self.name," ".join(self.prod))
-        else:
-            self.str = "%s -> " % self.name
-
-    def __str__(self):
-        return self.str
-
-    def __repr__(self):
-        return "Production("+str(self)+")"
-
-    def __len__(self):
-        return len(self.prod)
-
-    def __nonzero__(self):
-        return 1
-
-    def __getitem__(self,index):
-        return self.prod[index]
-            
-    # Return the nth lr_item from the production (or None if at the end)
-    def lr_item(self,n):
-        if n > len(self.prod): return None
-        p = LRItem(self,n)
-
-        # Precompute the list of productions immediately following.  Hack. Remove later
-        try:
-            p.lr_after = Prodnames[p.prod[n+1]]
-        except (IndexError,KeyError):
-            p.lr_after = []
-        try:
-            p.lr_before = p.prod[n-1]
-        except IndexError:
-            p.lr_before = None
-
-        return p
-    
-    # Bind the production function name to a callable
-    def bind(self,pdict):
-        if self.func:
-            self.callable = pdict[self.func]
-
-# This class serves as a minimal standin for Production objects when
-# reading table data from files.   It only contains information
-# actually used by the LR parsing engine, plus some additional
-# debugging information.
-class MiniProduction(object):
-    def __init__(self,str,name,len,func,file,line):
-        self.name     = name
-        self.len      = len
-        self.func     = func
-        self.callable = None
-        self.file     = file
-        self.line     = line
-        self.str      = str
-    def __str__(self):
-        return self.str
-    def __repr__(self):
-        return "MiniProduction(%s)" % self.str
-
-    # Bind the production function name to a callable
-    def bind(self,pdict):
-        if self.func:
-            self.callable = pdict[self.func]
-
-
-# -----------------------------------------------------------------------------
-# class LRItem
-#
-# This class represents a specific stage of parsing a production rule.  For
-# example: 
-#
-#       expr : expr . PLUS term 
-#
-# In the above, the "." represents the current location of the parse.  Here
-# basic attributes:
-#
-#       name       - Name of the production.  For example 'expr'
-#       prod       - A list of symbols on the right side ['expr','.', 'PLUS','term']
-#       number     - Production number.
-#
-#       lr_next      Next LR item. Example, if we are ' expr -> expr . PLUS term'
-#                    then lr_next refers to 'expr -> expr PLUS . term'
-#       lr_index   - LR item index (location of the ".") in the prod list.
-#       lookaheads - LALR lookahead symbols for this item
-#       len        - Length of the production (number of symbols on right hand side)
-#       lr_after    - List of all productions that immediately follow
-#       lr_before   - Grammar symbol immediately before
-# -----------------------------------------------------------------------------
-
-class LRItem(object):
-    def __init__(self,p,n):
-        self.name       = p.name
-        self.prod       = list(p.prod)
-        self.number     = p.number
-        self.lr_index   = n
-        self.lookaheads = { }
-        self.prod.insert(n,".")
-        self.prod       = tuple(self.prod)
-        self.len        = len(self.prod)
-        self.usyms      = p.usyms
-
-    def __str__(self):
-        if self.prod:
-            s = "%s -> %s" % (self.name," ".join(self.prod))
-        else:
-            s = "%s -> " % self.name
-        return s
-
-    def __repr__(self):
-        return "LRItem("+str(self)+")"
-
-# -----------------------------------------------------------------------------
-# rightmost_terminal()
-#
-# Return the rightmost terminal from a list of symbols.  Used in add_production()
-# -----------------------------------------------------------------------------
-def rightmost_terminal(symbols, terminals):
-    i = len(symbols) - 1
-    while i >= 0:
-        if symbols[i] in terminals:
-            return symbols[i]
-        i -= 1
-    return None
-
-# -----------------------------------------------------------------------------
-#                           === GRAMMAR CLASS ===
-#
-# The following class represents the contents of the specified grammar along
-# with various computed properties such as first sets, follow sets, LR items, etc.
-# This data is used for critical parts of the table generation process later.
-# -----------------------------------------------------------------------------
-
-class GrammarError(YaccError): pass
-
-class Grammar(object):
-    def __init__(self,terminals):
-        self.Productions  = [None]  # A list of all of the productions.  The first
-                                    # entry is always reserved for the purpose of
-                                    # building an augmented grammar
-
-        self.Prodnames    = { }     # A dictionary mapping the names of nonterminals to a list of all
-                                    # productions of that nonterminal.
-
-        self.Prodmap      = { }     # A dictionary that is only used to detect duplicate
-                                    # productions.
-
-        self.Terminals    = { }     # A dictionary mapping the names of terminal symbols to a
-                                    # list of the rules where they are used.
-
-        for term in terminals:
-            self.Terminals[term] = []
-
-        self.Terminals['error'] = []
-
-        self.Nonterminals = { }     # A dictionary mapping names of nonterminals to a list
-                                    # of rule numbers where they are used.
-
-        self.First        = { }     # A dictionary of precomputed FIRST(x) symbols
-
-        self.Follow       = { }     # A dictionary of precomputed FOLLOW(x) symbols
-
-        self.Precedence   = { }     # Precedence rules for each terminal. Contains tuples of the
-                                    # form ('right',level) or ('nonassoc', level) or ('left',level)
-
-        self.UsedPrecedence = { }   # Precedence rules that were actually used by the grammer.
-                                    # This is only used to provide error checking and to generate
-                                    # a warning about unused precedence rules.
-
-        self.Start = None           # Starting symbol for the grammar
-
-
-    def __len__(self):
-        return len(self.Productions)
-
-    def __getitem__(self,index):
-        return self.Productions[index]
-
-    # -----------------------------------------------------------------------------
-    # set_precedence()
-    #
-    # Sets the precedence for a given terminal. assoc is the associativity such as
-    # 'left','right', or 'nonassoc'.  level is a numeric level.
-    #
-    # -----------------------------------------------------------------------------
-
-    def set_precedence(self,term,assoc,level):
-        assert self.Productions == [None],"Must call set_precedence() before add_production()"
-        if term in self.Precedence:
-            raise GrammarError("Precedence already specified for terminal '%s'" % term)
-        if assoc not in ['left','right','nonassoc']:
-            raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'")
-        self.Precedence[term] = (assoc,level)
- 
-    # -----------------------------------------------------------------------------
-    # add_production()
-    #
-    # Given an action function, this function assembles a production rule and
-    # computes its precedence level.
-    #
-    # The production rule is supplied as a list of symbols.   For example,
-    # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and
-    # symbols ['expr','PLUS','term'].
-    #
-    # Precedence is determined by the precedence of the right-most non-terminal
-    # or the precedence of a terminal specified by %prec.
-    #
-    # A variety of error checks are performed to make sure production symbols
-    # are valid and that %prec is used correctly.
-    # -----------------------------------------------------------------------------
-
-    def add_production(self,prodname,syms,func=None,file='',line=0):
-
-        if prodname in self.Terminals:
-            raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname))
-        if prodname == 'error':
-            raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname))
-        if not _is_identifier.match(prodname):
-            raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname))
-
-        # Look for literal tokens 
-        for n,s in enumerate(syms):
-            if s[0] in "'\"":
-                 try:
-                     c = eval(s)
-                     if (len(c) > 1):
-                          raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname))
-                     if not c in self.Terminals:
-                          self.Terminals[c] = []
-                     syms[n] = c
-                     continue
-                 except SyntaxError:
-                     pass
-            if not _is_identifier.match(s) and s != '%prec':
-                raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname))
-        
-        # Determine the precedence level
-        if '%prec' in syms:
-            if syms[-1] == '%prec':
-                raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line))
-            if syms[-2] != '%prec':
-                raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line))
-            precname = syms[-1]
-            prodprec = self.Precedence.get(precname,None)
-            if not prodprec:
-                raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname))
-            else:
-                self.UsedPrecedence[precname] = 1
-            del syms[-2:]     # Drop %prec from the rule
-        else:
-            # If no %prec, precedence is determined by the rightmost terminal symbol
-            precname = rightmost_terminal(syms,self.Terminals)
-            prodprec = self.Precedence.get(precname,('right',0)) 
-            
-        # See if the rule is already in the rulemap
-        map = "%s -> %s" % (prodname,syms)
-        if map in self.Prodmap:
-            m = self.Prodmap[map]
-            raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) +
-                               "Previous definition at %s:%d" % (m.file, m.line))
-
-        # From this point on, everything is valid.  Create a new Production instance
-        pnumber  = len(self.Productions)
-        if not prodname in self.Nonterminals:
-            self.Nonterminals[prodname] = [ ]
-
-        # Add the production number to Terminals and Nonterminals
-        for t in syms:
-            if t in self.Terminals:
-                self.Terminals[t].append(pnumber)
-            else:
-                if not t in self.Nonterminals:
-                    self.Nonterminals[t] = [ ]
-                self.Nonterminals[t].append(pnumber)
-
-        # Create a production and add it to the list of productions
-        p = Production(pnumber,prodname,syms,prodprec,func,file,line)
-        self.Productions.append(p)
-        self.Prodmap[map] = p
-
-        # Add to the global productions list
-        try:
-            self.Prodnames[prodname].append(p)
-        except KeyError:
-            self.Prodnames[prodname] = [ p ]
-        return 0
-
-    # -----------------------------------------------------------------------------
-    # set_start()
-    #
-    # Sets the starting symbol and creates the augmented grammar.  Production 
-    # rule 0 is S' -> start where start is the start symbol.
-    # -----------------------------------------------------------------------------
-
-    def set_start(self,start=None):
-        if not start:
-            start = self.Productions[1].name
-        if start not in self.Nonterminals:
-            raise GrammarError("start symbol %s undefined" % start)
-        self.Productions[0] = Production(0,"S'",[start])
-        self.Nonterminals[start].append(0)
-        self.Start = start
-
-    # -----------------------------------------------------------------------------
-    # find_unreachable()
-    #
-    # Find all of the nonterminal symbols that can't be reached from the starting
-    # symbol.  Returns a list of nonterminals that can't be reached.
-    # -----------------------------------------------------------------------------
-
-    def find_unreachable(self):
-        
-        # Mark all symbols that are reachable from a symbol s
-        def mark_reachable_from(s):
-            if reachable[s]:
-                # We've already reached symbol s.
-                return
-            reachable[s] = 1
-            for p in self.Prodnames.get(s,[]):
-                for r in p.prod:
-                    mark_reachable_from(r)
-
-        reachable   = { }
-        for s in list(self.Terminals) + list(self.Nonterminals):
-            reachable[s] = 0
-
-        mark_reachable_from( self.Productions[0].prod[0] )
-
-        return [s for s in list(self.Nonterminals)
-                        if not reachable[s]]
-    
-    # -----------------------------------------------------------------------------
-    # infinite_cycles()
-    #
-    # This function looks at the various parsing rules and tries to detect
-    # infinite recursion cycles (grammar rules where there is no possible way
-    # to derive a string of only terminals).
-    # -----------------------------------------------------------------------------
-
-    def infinite_cycles(self):
-        terminates = {}
-
-        # Terminals:
-        for t in self.Terminals:
-            terminates[t] = 1
-
-        terminates['$end'] = 1
-
-        # Nonterminals:
-
-        # Initialize to false:
-        for n in self.Nonterminals:
-            terminates[n] = 0
-
-        # Then propagate termination until no change:
-        while 1:
-            some_change = 0
-            for (n,pl) in self.Prodnames.items():
-                # Nonterminal n terminates iff any of its productions terminates.
-                for p in pl:
-                    # Production p terminates iff all of its rhs symbols terminate.
-                    for s in p.prod:
-                        if not terminates[s]:
-                            # The symbol s does not terminate,
-                            # so production p does not terminate.
-                            p_terminates = 0
-                            break
-                    else:
-                        # didn't break from the loop,
-                        # so every symbol s terminates
-                        # so production p terminates.
-                        p_terminates = 1
-
-                    if p_terminates:
-                        # symbol n terminates!
-                        if not terminates[n]:
-                            terminates[n] = 1
-                            some_change = 1
-                        # Don't need to consider any more productions for this n.
-                        break
-
-            if not some_change:
-                break
-
-        infinite = []
-        for (s,term) in terminates.items():
-            if not term:
-                if not s in self.Prodnames and not s in self.Terminals and s != 'error':
-                    # s is used-but-not-defined, and we've already warned of that,
-                    # so it would be overkill to say that it's also non-terminating.
-                    pass
-                else:
-                    infinite.append(s)
-
-        return infinite
-
-
-    # -----------------------------------------------------------------------------
-    # undefined_symbols()
-    #
-    # Find all symbols that were used the grammar, but not defined as tokens or
-    # grammar rules.  Returns a list of tuples (sym, prod) where sym in the symbol
-    # and prod is the production where the symbol was used. 
-    # -----------------------------------------------------------------------------
-    def undefined_symbols(self):
-        result = []
-        for p in self.Productions:
-            if not p: continue
-
-            for s in p.prod:
-                if not s in self.Prodnames and not s in self.Terminals and s != 'error':
-                    result.append((s,p))
-        return result
-
-    # -----------------------------------------------------------------------------
-    # unused_terminals()
-    #
-    # Find all terminals that were defined, but not used by the grammar.  Returns
-    # a list of all symbols.
-    # -----------------------------------------------------------------------------
-    def unused_terminals(self):
-        unused_tok = []
-        for s,v in self.Terminals.items():
-            if s != 'error' and not v:
-                unused_tok.append(s)
-
-        return unused_tok
-
-    # ------------------------------------------------------------------------------
-    # unused_rules()
-    #
-    # Find all grammar rules that were defined,  but not used (maybe not reachable)
-    # Returns a list of productions.
-    # ------------------------------------------------------------------------------
-
-    def unused_rules(self):
-        unused_prod = []
-        for s,v in self.Nonterminals.items():
-            if not v:
-                p = self.Prodnames[s][0]
-                unused_prod.append(p)
-        return unused_prod
-
-    # -----------------------------------------------------------------------------
-    # unused_precedence()
-    #
-    # Returns a list of tuples (term,precedence) corresponding to precedence
-    # rules that were never used by the grammar.  term is the name of the terminal
-    # on which precedence was applied and precedence is a string such as 'left' or
-    # 'right' corresponding to the type of precedence. 
-    # -----------------------------------------------------------------------------
-
-    def unused_precedence(self):
-        unused = []
-        for termname in self.Precedence:
-            if not (termname in self.Terminals or termname in self.UsedPrecedence):
-                unused.append((termname,self.Precedence[termname][0]))
-                
-        return unused
-
-    # -------------------------------------------------------------------------
-    # _first()
-    #
-    # Compute the value of FIRST1(beta) where beta is a tuple of symbols.
-    #
-    # During execution of compute_first1, the result may be incomplete.
-    # Afterward (e.g., when called from compute_follow()), it will be complete.
-    # -------------------------------------------------------------------------
-    def _first(self,beta):
-
-        # We are computing First(x1,x2,x3,...,xn)
-        result = [ ]
-        for x in beta:
-            x_produces_empty = 0
-
-            # Add all the non- symbols of First[x] to the result.
-            for f in self.First[x]:
-                if f == '':
-                    x_produces_empty = 1
-                else:
-                    if f not in result: result.append(f)
-
-            if x_produces_empty:
-                # We have to consider the next x in beta,
-                # i.e. stay in the loop.
-                pass
-            else:
-                # We don't have to consider any further symbols in beta.
-                break
-        else:
-            # There was no 'break' from the loop,
-            # so x_produces_empty was true for all x in beta,
-            # so beta produces empty as well.
-            result.append('')
-
-        return result
-
-    # -------------------------------------------------------------------------
-    # compute_first()
-    #
-    # Compute the value of FIRST1(X) for all symbols
-    # -------------------------------------------------------------------------
-    def compute_first(self):
-        if self.First:
-            return self.First
-
-        # Terminals:
-        for t in self.Terminals:
-            self.First[t] = [t]
-
-        self.First['$end'] = ['$end']
-
-        # Nonterminals:
-
-        # Initialize to the empty set:
-        for n in self.Nonterminals:
-            self.First[n] = []
-
-        # Then propagate symbols until no change:
-        while 1:
-            some_change = 0
-            for n in self.Nonterminals:
-                for p in self.Prodnames[n]:
-                    for f in self._first(p.prod):
-                        if f not in self.First[n]:
-                            self.First[n].append( f )
-                            some_change = 1
-            if not some_change:
-                break
-        
-        return self.First
-
-    # ---------------------------------------------------------------------
-    # compute_follow()
-    #
-    # Computes all of the follow sets for every non-terminal symbol.  The
-    # follow set is the set of all symbols that might follow a given
-    # non-terminal.  See the Dragon book, 2nd Ed. p. 189.
-    # ---------------------------------------------------------------------
-    def compute_follow(self,start=None):
-        # If already computed, return the result
-        if self.Follow:
-            return self.Follow
-
-        # If first sets not computed yet, do that first.
-        if not self.First:
-            self.compute_first()
-
-        # Add '$end' to the follow list of the start symbol
-        for k in self.Nonterminals:
-            self.Follow[k] = [ ]
-
-        if not start:
-            start = self.Productions[1].name
-
-        self.Follow[start] = [ '$end' ]
-
-        while 1:
-            didadd = 0
-            for p in self.Productions[1:]:
-                # Here is the production set
-                for i in range(len(p.prod)):
-                    B = p.prod[i]
-                    if B in self.Nonterminals:
-                        # Okay. We got a non-terminal in a production
-                        fst = self._first(p.prod[i+1:])
-                        hasempty = 0
-                        for f in fst:
-                            if f != '' and f not in self.Follow[B]:
-                                self.Follow[B].append(f)
-                                didadd = 1
-                            if f == '':
-                                hasempty = 1
-                        if hasempty or i == (len(p.prod)-1):
-                            # Add elements of follow(a) to follow(b)
-                            for f in self.Follow[p.name]:
-                                if f not in self.Follow[B]:
-                                    self.Follow[B].append(f)
-                                    didadd = 1
-            if not didadd: break
-        return self.Follow
-
-
-    # -----------------------------------------------------------------------------
-    # build_lritems()
-    #
-    # This function walks the list of productions and builds a complete set of the
-    # LR items.  The LR items are stored in two ways:  First, they are uniquely
-    # numbered and placed in the list _lritems.  Second, a linked list of LR items
-    # is built for each production.  For example:
-    #
-    #   E -> E PLUS E
-    #
-    # Creates the list
-    #
-    #  [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ]
-    # -----------------------------------------------------------------------------
-
-    def build_lritems(self):
-        for p in self.Productions:
-            lastlri = p
-            i = 0
-            lr_items = []
-            while 1:
-                if i > len(p):
-                    lri = None
-                else:
-                    lri = LRItem(p,i)
-                    # Precompute the list of productions immediately following
-                    try:
-                        lri.lr_after = self.Prodnames[lri.prod[i+1]]
-                    except (IndexError,KeyError):
-                        lri.lr_after = []
-                    try:
-                        lri.lr_before = lri.prod[i-1]
-                    except IndexError:
-                        lri.lr_before = None
-
-                lastlri.lr_next = lri
-                if not lri: break
-                lr_items.append(lri)
-                lastlri = lri
-                i += 1
-            p.lr_items = lr_items
-
-# -----------------------------------------------------------------------------
-#                            == Class LRTable ==
-#
-# This basic class represents a basic table of LR parsing information.  
-# Methods for generating the tables are not defined here.  They are defined
-# in the derived class LRGeneratedTable.
-# -----------------------------------------------------------------------------
-
-class VersionError(YaccError): pass
-
-class LRTable(object):
-    def __init__(self):
-        self.lr_action = None
-        self.lr_goto = None
-        self.lr_productions = None
-        self.lr_method = None
-
-    def read_table(self,module):
-        if isinstance(module,types.ModuleType):
-            parsetab = module
-        else:
-            if sys.version_info[0] < 3:
-                exec("import %s as parsetab" % module)
-            else:
-                env = { }
-                exec("import %s as parsetab" % module, env, env)
-                parsetab = env['parsetab']
-
-        if parsetab._tabversion != __tabversion__:
-            raise VersionError("yacc table file version is out of date")
-
-        self.lr_action = parsetab._lr_action
-        self.lr_goto = parsetab._lr_goto
-
-        self.lr_productions = []
-        for p in parsetab._lr_productions:
-            self.lr_productions.append(MiniProduction(*p))
-
-        self.lr_method = parsetab._lr_method
-        return parsetab._lr_signature
-
-    def read_pickle(self,filename):
-        try:
-            import cPickle as pickle
-        except ImportError:
-            import pickle
-
-        in_f = open(filename,"rb")
-
-        tabversion = pickle.load(in_f)
-        if tabversion != __tabversion__:
-            raise VersionError("yacc table file version is out of date")
-        self.lr_method = pickle.load(in_f)
-        signature      = pickle.load(in_f)
-        self.lr_action = pickle.load(in_f)
-        self.lr_goto   = pickle.load(in_f)
-        productions    = pickle.load(in_f)
-
-        self.lr_productions = []
-        for p in productions:
-            self.lr_productions.append(MiniProduction(*p))
-
-        in_f.close()
-        return signature
-
-    # Bind all production function names to callable objects in pdict
-    def bind_callables(self,pdict):
-        for p in self.lr_productions:
-            p.bind(pdict)
-    
-# -----------------------------------------------------------------------------
-#                           === LR Generator ===
-#
-# The following classes and functions are used to generate LR parsing tables on 
-# a grammar.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# digraph()
-# traverse()
-#
-# The following two functions are used to compute set valued functions
-# of the form:
-#
-#     F(x) = F'(x) U U{F(y) | x R y}
-#
-# This is used to compute the values of Read() sets as well as FOLLOW sets
-# in LALR(1) generation.
-#
-# Inputs:  X    - An input set
-#          R    - A relation
-#          FP   - Set-valued function
-# ------------------------------------------------------------------------------
-
-def digraph(X,R,FP):
-    N = { }
-    for x in X:
-       N[x] = 0
-    stack = []
-    F = { }
-    for x in X:
-        if N[x] == 0: traverse(x,N,stack,F,X,R,FP)
-    return F
-
-def traverse(x,N,stack,F,X,R,FP):
-    stack.append(x)
-    d = len(stack)
-    N[x] = d
-    F[x] = FP(x)             # F(X) <- F'(x)
-
-    rel = R(x)               # Get y's related to x
-    for y in rel:
-        if N[y] == 0:
-             traverse(y,N,stack,F,X,R,FP)
-        N[x] = min(N[x],N[y])
-        for a in F.get(y,[]):
-            if a not in F[x]: F[x].append(a)
-    if N[x] == d:
-       N[stack[-1]] = MAXINT
-       F[stack[-1]] = F[x]
-       element = stack.pop()
-       while element != x:
-           N[stack[-1]] = MAXINT
-           F[stack[-1]] = F[x]
-           element = stack.pop()
-
-class LALRError(YaccError): pass
-
-# -----------------------------------------------------------------------------
-#                             == LRGeneratedTable ==
-#
-# This class implements the LR table generation algorithm.  There are no
-# public methods except for write()
-# -----------------------------------------------------------------------------
-
-class LRGeneratedTable(LRTable):
-    def __init__(self,grammar,method='LALR',log=None):
-        if method not in ['SLR','LALR']:
-            raise LALRError("Unsupported method %s" % method)
-
-        self.grammar = grammar
-        self.lr_method = method
-
-        # Set up the logger
-        if not log:
-            log = NullLogger()
-        self.log = log
-
-        # Internal attributes
-        self.lr_action     = {}        # Action table
-        self.lr_goto       = {}        # Goto table
-        self.lr_productions  = grammar.Productions    # Copy of grammar Production array
-        self.lr_goto_cache = {}        # Cache of computed gotos
-        self.lr0_cidhash   = {}        # Cache of closures
-
-        self._add_count    = 0         # Internal counter used to detect cycles
-
-        # Diagonistic information filled in by the table generator
-        self.sr_conflict   = 0
-        self.rr_conflict   = 0
-        self.conflicts     = []        # List of conflicts
-
-        self.sr_conflicts  = []
-        self.rr_conflicts  = []
-
-        # Build the tables
-        self.grammar.build_lritems()
-        self.grammar.compute_first()
-        self.grammar.compute_follow()
-        self.lr_parse_table()
-
-    # Compute the LR(0) closure operation on I, where I is a set of LR(0) items.
-
-    def lr0_closure(self,I):
-        self._add_count += 1
-
-        # Add everything in I to J
-        J = I[:]
-        didadd = 1
-        while didadd:
-            didadd = 0
-            for j in J:
-                for x in j.lr_after:
-                    if getattr(x,"lr0_added",0) == self._add_count: continue
-                    # Add B --> .G to J
-                    J.append(x.lr_next)
-                    x.lr0_added = self._add_count
-                    didadd = 1
-
-        return J
-
-    # Compute the LR(0) goto function goto(I,X) where I is a set
-    # of LR(0) items and X is a grammar symbol.   This function is written
-    # in a way that guarantees uniqueness of the generated goto sets
-    # (i.e. the same goto set will never be returned as two different Python
-    # objects).  With uniqueness, we can later do fast set comparisons using
-    # id(obj) instead of element-wise comparison.
-
-    def lr0_goto(self,I,x):
-        # First we look for a previously cached entry
-        g = self.lr_goto_cache.get((id(I),x),None)
-        if g: return g
-
-        # Now we generate the goto set in a way that guarantees uniqueness
-        # of the result
-
-        s = self.lr_goto_cache.get(x,None)
-        if not s:
-            s = { }
-            self.lr_goto_cache[x] = s
-
-        gs = [ ]
-        for p in I:
-            n = p.lr_next
-            if n and n.lr_before == x:
-                s1 = s.get(id(n),None)
-                if not s1:
-                    s1 = { }
-                    s[id(n)] = s1
-                gs.append(n)
-                s = s1
-        g = s.get('$end',None)
-        if not g:
-            if gs:
-                g = self.lr0_closure(gs)
-                s['$end'] = g
-            else:
-                s['$end'] = gs
-        self.lr_goto_cache[(id(I),x)] = g
-        return g
-
-    # Compute the LR(0) sets of item function
-    def lr0_items(self):
-
-        C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ]
-        i = 0
-        for I in C:
-            self.lr0_cidhash[id(I)] = i
-            i += 1
-
-        # Loop over the items in C and each grammar symbols
-        i = 0
-        while i < len(C):
-            I = C[i]
-            i += 1
-
-            # Collect all of the symbols that could possibly be in the goto(I,X) sets
-            asyms = { }
-            for ii in I:
-                for s in ii.usyms:
-                    asyms[s] = None
-
-            for x in asyms:
-                g = self.lr0_goto(I,x)
-                if not g:  continue
-                if id(g) in self.lr0_cidhash: continue
-                self.lr0_cidhash[id(g)] = len(C)
-                C.append(g)
-
-        return C
-
-    # -----------------------------------------------------------------------------
-    #                       ==== LALR(1) Parsing ====
-    #
-    # LALR(1) parsing is almost exactly the same as SLR except that instead of
-    # relying upon Follow() sets when performing reductions, a more selective
-    # lookahead set that incorporates the state of the LR(0) machine is utilized.
-    # Thus, we mainly just have to focus on calculating the lookahead sets.
-    #
-    # The method used here is due to DeRemer and Pennelo (1982).
-    #
-    # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1)
-    #     Lookahead Sets", ACM Transactions on Programming Languages and Systems,
-    #     Vol. 4, No. 4, Oct. 1982, pp. 615-649
-    #
-    # Further details can also be found in:
-    #
-    #  J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing",
-    #      McGraw-Hill Book Company, (1985).
-    #
-    # -----------------------------------------------------------------------------
-
-    # -----------------------------------------------------------------------------
-    # compute_nullable_nonterminals()
-    #
-    # Creates a dictionary containing all of the non-terminals that might produce
-    # an empty production.
-    # -----------------------------------------------------------------------------
-
-    def compute_nullable_nonterminals(self):
-        nullable = {}
-        num_nullable = 0
-        while 1:
-           for p in self.grammar.Productions[1:]:
-               if p.len == 0:
-                    nullable[p.name] = 1
-                    continue
-               for t in p.prod:
-                    if not t in nullable: break
-               else:
-                    nullable[p.name] = 1
-           if len(nullable) == num_nullable: break
-           num_nullable = len(nullable)
-        return nullable
-
-    # -----------------------------------------------------------------------------
-    # find_nonterminal_trans(C)
-    #
-    # Given a set of LR(0) items, this functions finds all of the non-terminal
-    # transitions.    These are transitions in which a dot appears immediately before
-    # a non-terminal.   Returns a list of tuples of the form (state,N) where state
-    # is the state number and N is the nonterminal symbol.
-    #
-    # The input C is the set of LR(0) items.
-    # -----------------------------------------------------------------------------
-
-    def find_nonterminal_transitions(self,C):
-         trans = []
-         for state in range(len(C)):
-             for p in C[state]:
-                 if p.lr_index < p.len - 1:
-                      t = (state,p.prod[p.lr_index+1])
-                      if t[1] in self.grammar.Nonterminals:
-                            if t not in trans: trans.append(t)
-             state = state + 1
-         return trans
-
-    # -----------------------------------------------------------------------------
-    # dr_relation()
-    #
-    # Computes the DR(p,A) relationships for non-terminal transitions.  The input
-    # is a tuple (state,N) where state is a number and N is a nonterminal symbol.
-    #
-    # Returns a list of terminals.
-    # -----------------------------------------------------------------------------
-
-    def dr_relation(self,C,trans,nullable):
-        dr_set = { }
-        state,N = trans
-        terms = []
-
-        g = self.lr0_goto(C[state],N)
-        for p in g:
-           if p.lr_index < p.len - 1:
-               a = p.prod[p.lr_index+1]
-               if a in self.grammar.Terminals:
-                   if a not in terms: terms.append(a)
-
-        # This extra bit is to handle the start state
-        if state == 0 and N == self.grammar.Productions[0].prod[0]:
-           terms.append('$end')
-
-        return terms
-
-    # -----------------------------------------------------------------------------
-    # reads_relation()
-    #
-    # Computes the READS() relation (p,A) READS (t,C).
-    # -----------------------------------------------------------------------------
-
-    def reads_relation(self,C, trans, empty):
-        # Look for empty transitions
-        rel = []
-        state, N = trans
-
-        g = self.lr0_goto(C[state],N)
-        j = self.lr0_cidhash.get(id(g),-1)
-        for p in g:
-            if p.lr_index < p.len - 1:
-                 a = p.prod[p.lr_index + 1]
-                 if a in empty:
-                      rel.append((j,a))
-
-        return rel
-
-    # -----------------------------------------------------------------------------
-    # compute_lookback_includes()
-    #
-    # Determines the lookback and includes relations
-    #
-    # LOOKBACK:
-    #
-    # This relation is determined by running the LR(0) state machine forward.
-    # For example, starting with a production "N : . A B C", we run it forward
-    # to obtain "N : A B C ."   We then build a relationship between this final
-    # state and the starting state.   These relationships are stored in a dictionary
-    # lookdict.
-    #
-    # INCLUDES:
-    #
-    # Computes the INCLUDE() relation (p,A) INCLUDES (p',B).
-    #
-    # This relation is used to determine non-terminal transitions that occur
-    # inside of other non-terminal transition states.   (p,A) INCLUDES (p', B)
-    # if the following holds:
-    #
-    #       B -> LAT, where T -> epsilon and p' -L-> p
-    #
-    # L is essentially a prefix (which may be empty), T is a suffix that must be
-    # able to derive an empty string.  State p' must lead to state p with the string L.
-    #
-    # -----------------------------------------------------------------------------
-
-    def compute_lookback_includes(self,C,trans,nullable):
-
-        lookdict = {}          # Dictionary of lookback relations
-        includedict = {}       # Dictionary of include relations
-
-        # Make a dictionary of non-terminal transitions
-        dtrans = {}
-        for t in trans:
-            dtrans[t] = 1
-
-        # Loop over all transitions and compute lookbacks and includes
-        for state,N in trans:
-            lookb = []
-            includes = []
-            for p in C[state]:
-                if p.name != N: continue
-
-                # Okay, we have a name match.  We now follow the production all the way
-                # through the state machine until we get the . on the right hand side
-
-                lr_index = p.lr_index
-                j = state
-                while lr_index < p.len - 1:
-                     lr_index = lr_index + 1
-                     t = p.prod[lr_index]
-
-                     # Check to see if this symbol and state are a non-terminal transition
-                     if (j,t) in dtrans:
-                           # Yes.  Okay, there is some chance that this is an includes relation
-                           # the only way to know for certain is whether the rest of the
-                           # production derives empty
-
-                           li = lr_index + 1
-                           while li < p.len:
-                                if p.prod[li] in self.grammar.Terminals: break      # No forget it
-                                if not p.prod[li] in nullable: break
-                                li = li + 1
-                           else:
-                                # Appears to be a relation between (j,t) and (state,N)
-                                includes.append((j,t))
-
-                     g = self.lr0_goto(C[j],t)               # Go to next set
-                     j = self.lr0_cidhash.get(id(g),-1)     # Go to next state
-
-                # When we get here, j is the final state, now we have to locate the production
-                for r in C[j]:
-                     if r.name != p.name: continue
-                     if r.len != p.len:   continue
-                     i = 0
-                     # This look is comparing a production ". A B C" with "A B C ."
-                     while i < r.lr_index:
-                          if r.prod[i] != p.prod[i+1]: break
-                          i = i + 1
-                     else:
-                          lookb.append((j,r))
-            for i in includes:
-                 if not i in includedict: includedict[i] = []
-                 includedict[i].append((state,N))
-            lookdict[(state,N)] = lookb
-
-        return lookdict,includedict
-
-    # -----------------------------------------------------------------------------
-    # compute_read_sets()
-    #
-    # Given a set of LR(0) items, this function computes the read sets.
-    #
-    # Inputs:  C        =  Set of LR(0) items
-    #          ntrans   = Set of nonterminal transitions
-    #          nullable = Set of empty transitions
-    #
-    # Returns a set containing the read sets
-    # -----------------------------------------------------------------------------
-
-    def compute_read_sets(self,C, ntrans, nullable):
-        FP = lambda x: self.dr_relation(C,x,nullable)
-        R =  lambda x: self.reads_relation(C,x,nullable)
-        F = digraph(ntrans,R,FP)
-        return F
-
-    # -----------------------------------------------------------------------------
-    # compute_follow_sets()
-    #
-    # Given a set of LR(0) items, a set of non-terminal transitions, a readset,
-    # and an include set, this function computes the follow sets
-    #
-    # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)}
-    #
-    # Inputs:
-    #            ntrans     = Set of nonterminal transitions
-    #            readsets   = Readset (previously computed)
-    #            inclsets   = Include sets (previously computed)
-    #
-    # Returns a set containing the follow sets
-    # -----------------------------------------------------------------------------
-
-    def compute_follow_sets(self,ntrans,readsets,inclsets):
-         FP = lambda x: readsets[x]
-         R  = lambda x: inclsets.get(x,[])
-         F = digraph(ntrans,R,FP)
-         return F
-
-    # -----------------------------------------------------------------------------
-    # add_lookaheads()
-    #
-    # Attaches the lookahead symbols to grammar rules.
-    #
-    # Inputs:    lookbacks         -  Set of lookback relations
-    #            followset         -  Computed follow set
-    #
-    # This function directly attaches the lookaheads to productions contained
-    # in the lookbacks set
-    # -----------------------------------------------------------------------------
-
-    def add_lookaheads(self,lookbacks,followset):
-        for trans,lb in lookbacks.items():
-            # Loop over productions in lookback
-            for state,p in lb:
-                 if not state in p.lookaheads:
-                      p.lookaheads[state] = []
-                 f = followset.get(trans,[])
-                 for a in f:
-                      if a not in p.lookaheads[state]: p.lookaheads[state].append(a)
-
-    # -----------------------------------------------------------------------------
-    # add_lalr_lookaheads()
-    #
-    # This function does all of the work of adding lookahead information for use
-    # with LALR parsing
-    # -----------------------------------------------------------------------------
-
-    def add_lalr_lookaheads(self,C):
-        # Determine all of the nullable nonterminals
-        nullable = self.compute_nullable_nonterminals()
-
-        # Find all non-terminal transitions
-        trans = self.find_nonterminal_transitions(C)
-
-        # Compute read sets
-        readsets = self.compute_read_sets(C,trans,nullable)
-
-        # Compute lookback/includes relations
-        lookd, included = self.compute_lookback_includes(C,trans,nullable)
-
-        # Compute LALR FOLLOW sets
-        followsets = self.compute_follow_sets(trans,readsets,included)
-
-        # Add all of the lookaheads
-        self.add_lookaheads(lookd,followsets)
-
-    # -----------------------------------------------------------------------------
-    # lr_parse_table()
-    #
-    # This function constructs the parse tables for SLR or LALR
-    # -----------------------------------------------------------------------------
-    def lr_parse_table(self):
-        Productions = self.grammar.Productions
-        Precedence  = self.grammar.Precedence
-        goto   = self.lr_goto         # Goto array
-        action = self.lr_action       # Action array
-        log    = self.log             # Logger for output
-
-        actionp = { }                 # Action production array (temporary)
-        
-        log.info("Parsing method: %s", self.lr_method)
-
-        # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items
-        # This determines the number of states
-
-        C = self.lr0_items()
-
-        if self.lr_method == 'LALR':
-            self.add_lalr_lookaheads(C)
-
-        # Build the parser table, state by state
-        st = 0
-        for I in C:
-            # Loop over each production in I
-            actlist = [ ]              # List of actions
-            st_action  = { }
-            st_actionp = { }
-            st_goto    = { }
-            log.info("")
-            log.info("state %d", st)
-            log.info("")
-            for p in I:
-                log.info("    (%d) %s", p.number, str(p))
-            log.info("")
-
-            for p in I:
-                    if p.len == p.lr_index + 1:
-                        if p.name == "S'":
-                            # Start symbol. Accept!
-                            st_action["$end"] = 0
-                            st_actionp["$end"] = p
-                        else:
-                            # We are at the end of a production.  Reduce!
-                            if self.lr_method == 'LALR':
-                                laheads = p.lookaheads[st]
-                            else:
-                                laheads = self.grammar.Follow[p.name]
-                            for a in laheads:
-                                actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p)))
-                                r = st_action.get(a,None)
-                                if r is not None:
-                                    # Whoa. Have a shift/reduce or reduce/reduce conflict
-                                    if r > 0:
-                                        # Need to decide on shift or reduce here
-                                        # By default we favor shifting. Need to add
-                                        # some precedence rules here.
-                                        sprec,slevel = Productions[st_actionp[a].number].prec
-                                        rprec,rlevel = Precedence.get(a,('right',0))
-                                        if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')):
-                                            # We really need to reduce here.
-                                            st_action[a] = -p.number
-                                            st_actionp[a] = p
-                                            if not slevel and not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as reduce",a)
-                                                self.sr_conflicts.append((st,a,'reduce'))
-                                            Productions[p.number].reduced += 1
-                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
-                                            st_action[a] = None
-                                        else:
-                                            # Hmmm. Guess we'll keep the shift
-                                            if not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as shift",a)
-                                                self.sr_conflicts.append((st,a,'shift'))
-                                    elif r < 0:
-                                        # Reduce/reduce conflict.   In this case, we favor the rule
-                                        # that was defined first in the grammar file
-                                        oldp = Productions[-r]
-                                        pp = Productions[p.number]
-                                        if oldp.line > pp.line:
-                                            st_action[a] = -p.number
-                                            st_actionp[a] = p
-                                            chosenp,rejectp = pp,oldp
-                                            Productions[p.number].reduced += 1
-                                            Productions[oldp.number].reduced -= 1
-                                        else:
-                                            chosenp,rejectp = oldp,pp
-                                        self.rr_conflicts.append((st,chosenp,rejectp))
-                                        log.info("  ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a])
-                                    else:
-                                        raise LALRError("Unknown conflict in state %d" % st)
-                                else:
-                                    st_action[a] = -p.number
-                                    st_actionp[a] = p
-                                    Productions[p.number].reduced += 1
-                    else:
-                        i = p.lr_index
-                        a = p.prod[i+1]       # Get symbol right after the "."
-                        if a in self.grammar.Terminals:
-                            g = self.lr0_goto(I,a)
-                            j = self.lr0_cidhash.get(id(g),-1)
-                            if j >= 0:
-                                # We are in a shift state
-                                actlist.append((a,p,"shift and go to state %d" % j))
-                                r = st_action.get(a,None)
-                                if r is not None:
-                                    # Whoa have a shift/reduce or shift/shift conflict
-                                    if r > 0:
-                                        if r != j:
-                                            raise LALRError("Shift/shift conflict in state %d" % st)
-                                    elif r < 0:
-                                        # Do a precedence check.
-                                        #   -  if precedence of reduce rule is higher, we reduce.
-                                        #   -  if precedence of reduce is same and left assoc, we reduce.
-                                        #   -  otherwise we shift
-                                        rprec,rlevel = Productions[st_actionp[a].number].prec
-                                        sprec,slevel = Precedence.get(a,('right',0))
-                                        if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')):
-                                            # We decide to shift here... highest precedence to shift
-                                            Productions[st_actionp[a].number].reduced -= 1
-                                            st_action[a] = j
-                                            st_actionp[a] = p
-                                            if not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as shift",a)
-                                                self.sr_conflicts.append((st,a,'shift'))
-                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
-                                            st_action[a] = None
-                                        else:
-                                            # Hmmm. Guess we'll keep the reduce
-                                            if not slevel and not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as reduce",a)
-                                                self.sr_conflicts.append((st,a,'reduce'))
-
-                                    else:
-                                        raise LALRError("Unknown conflict in state %d" % st)
-                                else:
-                                    st_action[a] = j
-                                    st_actionp[a] = p
-
-            # Print the actions associated with each terminal
-            _actprint = { }
-            for a,p,m in actlist:
-                if a in st_action:
-                    if p is st_actionp[a]:
-                        log.info("    %-15s %s",a,m)
-                        _actprint[(a,m)] = 1
-            log.info("")
-            # Print the actions that were not used. (debugging)
-            not_used = 0
-            for a,p,m in actlist:
-                if a in st_action:
-                    if p is not st_actionp[a]:
-                        if not (a,m) in _actprint:
-                            log.debug("  ! %-15s [ %s ]",a,m)
-                            not_used = 1
-                            _actprint[(a,m)] = 1
-            if not_used:
-                log.debug("")
-
-            # Construct the goto table for this state
-
-            nkeys = { }
-            for ii in I:
-                for s in ii.usyms:
-                    if s in self.grammar.Nonterminals:
-                        nkeys[s] = None
-            for n in nkeys:
-                g = self.lr0_goto(I,n)
-                j = self.lr0_cidhash.get(id(g),-1)
-                if j >= 0:
-                    st_goto[n] = j
-                    log.info("    %-30s shift and go to state %d",n,j)
-
-            action[st] = st_action
-            actionp[st] = st_actionp
-            goto[st] = st_goto
-            st += 1
-
-
-    # -----------------------------------------------------------------------------
-    # write()
-    #
-    # This function writes the LR parsing tables to a file
-    # -----------------------------------------------------------------------------
-
-    def write_table(self,modulename,outputdir='',signature=""):
-        basemodulename = modulename.split(".")[-1]
-        filename = os.path.join(outputdir,basemodulename) + ".py"
-        try:
-            f = open(filename,"w")
-
-            f.write("""
-# %s
-# This file is automatically generated. Do not edit.
-_tabversion = %r
-
-_lr_method = %r
-
-_lr_signature = %r
-    """ % (filename, __tabversion__, self.lr_method, signature))
-
-            # Change smaller to 0 to go back to original tables
-            smaller = 1
-
-            # Factor out names to try and make smaller
-            if smaller:
-                items = { }
-
-                for s,nd in self.lr_action.items():
-                   for name,v in nd.items():
-                      i = items.get(name)
-                      if not i:
-                         i = ([],[])
-                         items[name] = i
-                      i[0].append(s)
-                      i[1].append(v)
-
-                f.write("\n_lr_action_items = {")
-                for k,v in items.items():
-                    f.write("%r:([" % k)
-                    for i in v[0]:
-                        f.write("%r," % i)
-                    f.write("],[")
-                    for i in v[1]:
-                        f.write("%r," % i)
-
-                    f.write("]),")
-                f.write("}\n")
-
-                f.write("""
-_lr_action = { }
-for _k, _v in _lr_action_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-      if not _x in _lr_action:  _lr_action[_x] = { }
-      _lr_action[_x][_k] = _y
-del _lr_action_items
-""")
-
-            else:
-                f.write("\n_lr_action = { ");
-                for k,v in self.lr_action.items():
-                    f.write("(%r,%r):%r," % (k[0],k[1],v))
-                f.write("}\n");
-
-            if smaller:
-                # Factor out names to try and make smaller
-                items = { }
-
-                for s,nd in self.lr_goto.items():
-                   for name,v in nd.items():
-                      i = items.get(name)
-                      if not i:
-                         i = ([],[])
-                         items[name] = i
-                      i[0].append(s)
-                      i[1].append(v)
-
-                f.write("\n_lr_goto_items = {")
-                for k,v in items.items():
-                    f.write("%r:([" % k)
-                    for i in v[0]:
-                        f.write("%r," % i)
-                    f.write("],[")
-                    for i in v[1]:
-                        f.write("%r," % i)
-
-                    f.write("]),")
-                f.write("}\n")
-
-                f.write("""
-_lr_goto = { }
-for _k, _v in _lr_goto_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-       if not _x in _lr_goto: _lr_goto[_x] = { }
-       _lr_goto[_x][_k] = _y
-del _lr_goto_items
-""")
-            else:
-                f.write("\n_lr_goto = { ");
-                for k,v in self.lr_goto.items():
-                    f.write("(%r,%r):%r," % (k[0],k[1],v))
-                f.write("}\n");
-
-            # Write production table
-            f.write("_lr_productions = [\n")
-            for p in self.lr_productions:
-                if p.func:
-                    f.write("  (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line))
-                else:
-                    f.write("  (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len))
-            f.write("]\n")
-            f.close()
-
-        except IOError:
-            e = sys.exc_info()[1]
-            sys.stderr.write("Unable to create '%s'\n" % filename)
-            sys.stderr.write(str(e)+"\n")
-            return
-
-
-    # -----------------------------------------------------------------------------
-    # pickle_table()
-    #
-    # This function pickles the LR parsing tables to a supplied file object
-    # -----------------------------------------------------------------------------
-
-    def pickle_table(self,filename,signature=""):
-        try:
-            import cPickle as pickle
-        except ImportError:
-            import pickle
-        outf = open(filename,"wb")
-        pickle.dump(__tabversion__,outf,pickle_protocol)
-        pickle.dump(self.lr_method,outf,pickle_protocol)
-        pickle.dump(signature,outf,pickle_protocol)
-        pickle.dump(self.lr_action,outf,pickle_protocol)
-        pickle.dump(self.lr_goto,outf,pickle_protocol)
-
-        outp = []
-        for p in self.lr_productions:
-            if p.func:
-                outp.append((p.str,p.name, p.len, p.func,p.file,p.line))
-            else:
-                outp.append((str(p),p.name,p.len,None,None,None))
-        pickle.dump(outp,outf,pickle_protocol)
-        outf.close()
-
-# -----------------------------------------------------------------------------
-#                            === INTROSPECTION ===
-#
-# The following functions and classes are used to implement the PLY
-# introspection features followed by the yacc() function itself.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# get_caller_module_dict()
-#
-# This function returns a dictionary containing all of the symbols defined within
-# a caller further down the call stack.  This is used to get the environment
-# associated with the yacc() call if none was provided.
-# -----------------------------------------------------------------------------
-
-def get_caller_module_dict(levels):
-    try:
-        raise RuntimeError
-    except RuntimeError:
-        e,b,t = sys.exc_info()
-        f = t.tb_frame
-        while levels > 0:
-            f = f.f_back                   
-            levels -= 1
-        ldict = f.f_globals.copy()
-        if f.f_globals != f.f_locals:
-            ldict.update(f.f_locals)
-
-        return ldict
-
-# -----------------------------------------------------------------------------
-# parse_grammar()
-#
-# This takes a raw grammar rule string and parses it into production data
-# -----------------------------------------------------------------------------
-def parse_grammar(doc,file,line):
-    grammar = []
-    # Split the doc string into lines
-    pstrings = doc.splitlines()
-    lastp = None
-    dline = line
-    for ps in pstrings:
-        dline += 1
-        p = ps.split()
-        if not p: continue
-        try:
-            if p[0] == '|':
-                # This is a continuation of a previous rule
-                if not lastp:
-                    raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline))
-                prodname = lastp
-                syms = p[1:]
-            else:
-                prodname = p[0]
-                lastp = prodname
-                syms   = p[2:]
-                assign = p[1]
-                if assign != ':' and assign != '::=':
-                    raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline))
-
-            grammar.append((file,dline,prodname,syms))
-        except SyntaxError:
-            raise
-        except Exception:
-            raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip()))
-
-    return grammar
-
-# -----------------------------------------------------------------------------
-# ParserReflect()
-#
-# This class represents information extracted for building a parser including
-# start symbol, error function, tokens, precedence list, action functions,
-# etc.
-# -----------------------------------------------------------------------------
-class ParserReflect(object):
-    def __init__(self,pdict,log=None):
-        self.pdict      = pdict
-        self.start      = None
-        self.error_func = None
-        self.tokens     = None
-        self.files      = {}
-        self.grammar    = []
-        self.error      = 0
-
-        if log is None:
-            self.log = PlyLogger(sys.stderr)
-        else:
-            self.log = log
-
-    # Get all of the basic information
-    def get_all(self):
-        self.get_start()
-        self.get_error_func()
-        self.get_tokens()
-        self.get_precedence()
-        self.get_pfunctions()
-        
-    # Validate all of the information
-    def validate_all(self):
-        self.validate_start()
-        self.validate_error_func()
-        self.validate_tokens()
-        self.validate_precedence()
-        self.validate_pfunctions()
-        self.validate_files()
-        return self.error
-
-    # Compute a signature over the grammar
-    def signature(self):
-        try:
-            from hashlib import md5
-        except ImportError:
-            from md5 import md5
-        try:
-            sig = md5()
-            if self.start:
-                sig.update(self.start.encode('latin-1'))
-            if self.prec:
-                sig.update("".join(["".join(p) for p in self.prec]).encode('latin-1'))
-            if self.tokens:
-                sig.update(" ".join(self.tokens).encode('latin-1'))
-            for f in self.pfuncs:
-                if f[3]:
-                    sig.update(f[3].encode('latin-1'))
-        except (TypeError,ValueError):
-            pass
-        return sig.digest()
-
-    # -----------------------------------------------------------------------------
-    # validate_file()
-    #
-    # This method checks to see if there are duplicated p_rulename() functions
-    # in the parser module file.  Without this function, it is really easy for
-    # users to make mistakes by cutting and pasting code fragments (and it's a real
-    # bugger to try and figure out why the resulting parser doesn't work).  Therefore,
-    # we just do a little regular expression pattern matching of def statements
-    # to try and detect duplicates.
-    # -----------------------------------------------------------------------------
-
-    def validate_files(self):
-        # Match def p_funcname(
-        fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(')
-
-        for filename in self.files.keys():
-            base,ext = os.path.splitext(filename)
-            if ext != '.py': return 1          # No idea. Assume it's okay.
-
-            try:
-                f = open(filename)
-                lines = f.readlines()
-                f.close()
-            except IOError:
-                continue
-
-            counthash = { }
-            for linen,l in enumerate(lines):
-                linen += 1
-                m = fre.match(l)
-                if m:
-                    name = m.group(1)
-                    prev = counthash.get(name)
-                    if not prev:
-                        counthash[name] = linen
-                    else:
-                        self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev)
-
-    # Get the start symbol
-    def get_start(self):
-        self.start = self.pdict.get('start')
-
-    # Validate the start symbol
-    def validate_start(self):
-        if self.start is not None:
-            if not isinstance(self.start,str):
-                self.log.error("'start' must be a string")
-
-    # Look for error handler
-    def get_error_func(self):
-        self.error_func = self.pdict.get('p_error')
-
-    # Validate the error function
-    def validate_error_func(self):
-        if self.error_func:
-            if isinstance(self.error_func,types.FunctionType):
-                ismethod = 0
-            elif isinstance(self.error_func, types.MethodType):
-                ismethod = 1
-            else:
-                self.log.error("'p_error' defined, but is not a function or method")
-                self.error = 1
-                return
-
-            eline = func_code(self.error_func).co_firstlineno
-            efile = func_code(self.error_func).co_filename
-            self.files[efile] = 1
-
-            if (func_code(self.error_func).co_argcount != 1+ismethod):
-                self.log.error("%s:%d: p_error() requires 1 argument",efile,eline)
-                self.error = 1
-
-    # Get the tokens map
-    def get_tokens(self):
-        tokens = self.pdict.get("tokens",None)
-        if not tokens:
-            self.log.error("No token list is defined")
-            self.error = 1
-            return
-
-        if not isinstance(tokens,(list, tuple)):
-            self.log.error("tokens must be a list or tuple")
-            self.error = 1
-            return
-        
-        if not tokens:
-            self.log.error("tokens is empty")
-            self.error = 1
-            return
-
-        self.tokens = tokens
-
-    # Validate the tokens
-    def validate_tokens(self):
-        # Validate the tokens.
-        if 'error' in self.tokens:
-            self.log.error("Illegal token name 'error'. Is a reserved word")
-            self.error = 1
-            return
-
-        terminals = {}
-        for n in self.tokens:
-            if n in terminals:
-                self.log.warning("Token '%s' multiply defined", n)
-            terminals[n] = 1
-
-    # Get the precedence map (if any)
-    def get_precedence(self):
-        self.prec = self.pdict.get("precedence",None)
-
-    # Validate and parse the precedence map
-    def validate_precedence(self):
-        preclist = []
-        if self.prec:
-            if not isinstance(self.prec,(list,tuple)):
-                self.log.error("precedence must be a list or tuple")
-                self.error = 1
-                return
-            for level,p in enumerate(self.prec):
-                if not isinstance(p,(list,tuple)):
-                    self.log.error("Bad precedence table")
-                    self.error = 1
-                    return
-
-                if len(p) < 2:
-                    self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p)
-                    self.error = 1
-                    return
-                assoc = p[0]
-                if not isinstance(assoc,str):
-                    self.log.error("precedence associativity must be a string")
-                    self.error = 1
-                    return
-                for term in p[1:]:
-                    if not isinstance(term,str):
-                        self.log.error("precedence items must be strings")
-                        self.error = 1
-                        return
-                    preclist.append((term,assoc,level+1))
-        self.preclist = preclist
-
-    # Get all p_functions from the grammar
-    def get_pfunctions(self):
-        p_functions = []
-        for name, item in self.pdict.items():
-            if name[:2] != 'p_': continue
-            if name == 'p_error': continue
-            if isinstance(item,(types.FunctionType,types.MethodType)):
-                line = func_code(item).co_firstlineno
-                file = func_code(item).co_filename
-                p_functions.append((line,file,name,item.__doc__))
-
-        # Sort all of the actions by line number
-        p_functions.sort()
-        self.pfuncs = p_functions
-
-
-    # Validate all of the p_functions
-    def validate_pfunctions(self):
-        grammar = []
-        # Check for non-empty symbols
-        if len(self.pfuncs) == 0:
-            self.log.error("no rules of the form p_rulename are defined")
-            self.error = 1
-            return 
-        
-        for line, file, name, doc in self.pfuncs:
-            func = self.pdict[name]
-            if isinstance(func, types.MethodType):
-                reqargs = 2
-            else:
-                reqargs = 1
-            if func_code(func).co_argcount > reqargs:
-                self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__)
-                self.error = 1
-            elif func_code(func).co_argcount < reqargs:
-                self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__)
-                self.error = 1
-            elif not func.__doc__:
-                self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__)
-            else:
-                try:
-                    parsed_g = parse_grammar(doc,file,line)
-                    for g in parsed_g:
-                        grammar.append((name, g))
-                except SyntaxError:
-                    e = sys.exc_info()[1]
-                    self.log.error(str(e))
-                    self.error = 1
-
-                # Looks like a valid grammar rule
-                # Mark the file in which defined.
-                self.files[file] = 1
-
-        # Secondary validation step that looks for p_ definitions that are not functions
-        # or functions that look like they might be grammar rules.
-
-        for n,v in self.pdict.items():
-            if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue
-            if n[0:2] == 't_': continue
-            if n[0:2] == 'p_' and n != 'p_error':
-                self.log.warning("'%s' not defined as a function", n)
-            if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or
-                (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)):
-                try:
-                    doc = v.__doc__.split(" ")
-                    if doc[1] == ':':
-                        self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix",
-                                         func_code(v).co_filename, func_code(v).co_firstlineno,n)
-                except Exception:
-                    pass
-
-        self.grammar = grammar
-
-# -----------------------------------------------------------------------------
-# yacc(module)
-#
-# Build a parser
-# -----------------------------------------------------------------------------
-
-def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, 
-         check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='',
-         debuglog=None, errorlog = None, picklefile=None):
-
-    global parse                 # Reference to the parsing method of the last built parser
-
-    # If pickling is enabled, table files are not created
-
-    if picklefile:
-        write_tables = 0
-
-    if errorlog is None:
-        errorlog = PlyLogger(sys.stderr)
-
-    # Get the module dictionary used for the parser
-    if module:
-        _items = [(k,getattr(module,k)) for k in dir(module)]
-        pdict = dict(_items)
-    else:
-        pdict = get_caller_module_dict(2)
-
-    # Collect parser information from the dictionary
-    pinfo = ParserReflect(pdict,log=errorlog)
-    pinfo.get_all()
-
-    if pinfo.error:
-        raise YaccError("Unable to build parser")
-
-    # Check signature against table files (if any)
-    signature = pinfo.signature()
-
-    # Read the tables
-    try:
-        lr = LRTable()
-        if picklefile:
-            read_signature = lr.read_pickle(picklefile)
-        else:
-            read_signature = lr.read_table(tabmodule)
-        if optimize or (read_signature == signature):
-            try:
-                lr.bind_callables(pinfo.pdict)
-                parser = LRParser(lr,pinfo.error_func)
-                parse = parser.parse
-                return parser
-            except Exception:
-                e = sys.exc_info()[1]
-                errorlog.warning("There was a problem loading the table file: %s", repr(e))
-    except VersionError:
-        e = sys.exc_info()
-        errorlog.warning(str(e))
-    except Exception:
-        pass
-
-    if debuglog is None:
-        if debug:
-            debuglog = PlyLogger(open(debugfile,"w"))
-        else:
-            debuglog = NullLogger()
-
-    debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__)
-
-
-    errors = 0
-
-    # Validate the parser information
-    if pinfo.validate_all():
-        raise YaccError("Unable to build parser")
-    
-    if not pinfo.error_func:
-        errorlog.warning("no p_error() function is defined")
-
-    # Create a grammar object
-    grammar = Grammar(pinfo.tokens)
-
-    # Set precedence level for terminals
-    for term, assoc, level in pinfo.preclist:
-        try:
-            grammar.set_precedence(term,assoc,level)
-        except GrammarError:
-            e = sys.exc_info()[1]
-            errorlog.warning("%s",str(e))
-
-    # Add productions to the grammar
-    for funcname, gram in pinfo.grammar:
-        file, line, prodname, syms = gram
-        try:
-            grammar.add_production(prodname,syms,funcname,file,line)
-        except GrammarError:
-            e = sys.exc_info()[1]
-            errorlog.error("%s",str(e))
-            errors = 1
-
-    # Set the grammar start symbols
-    try:
-        if start is None:
-            grammar.set_start(pinfo.start)
-        else:
-            grammar.set_start(start)
-    except GrammarError:
-        e = sys.exc_info()[1]
-        errorlog.error(str(e))
-        errors = 1
-
-    if errors:
-        raise YaccError("Unable to build parser")
-
-    # Verify the grammar structure
-    undefined_symbols = grammar.undefined_symbols()
-    for sym, prod in undefined_symbols:
-        errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym)
-        errors = 1
-
-    unused_terminals = grammar.unused_terminals()
-    if unused_terminals:
-        debuglog.info("")
-        debuglog.info("Unused terminals:")
-        debuglog.info("")
-        for term in unused_terminals:
-            errorlog.warning("Token '%s' defined, but not used", term)
-            debuglog.info("    %s", term)
-
-    # Print out all productions to the debug log
-    if debug:
-        debuglog.info("")
-        debuglog.info("Grammar")
-        debuglog.info("")
-        for n,p in enumerate(grammar.Productions):
-            debuglog.info("Rule %-5d %s", n, p)
-
-    # Find unused non-terminals
-    unused_rules = grammar.unused_rules()
-    for prod in unused_rules:
-        errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name)
-
-    if len(unused_terminals) == 1:
-        errorlog.warning("There is 1 unused token")
-    if len(unused_terminals) > 1:
-        errorlog.warning("There are %d unused tokens", len(unused_terminals))
-
-    if len(unused_rules) == 1:
-        errorlog.warning("There is 1 unused rule")
-    if len(unused_rules) > 1:
-        errorlog.warning("There are %d unused rules", len(unused_rules))
-
-    if debug:
-        debuglog.info("")
-        debuglog.info("Terminals, with rules where they appear")
-        debuglog.info("")
-        terms = list(grammar.Terminals)
-        terms.sort()
-        for term in terms:
-            debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]]))
-        
-        debuglog.info("")
-        debuglog.info("Nonterminals, with rules where they appear")
-        debuglog.info("")
-        nonterms = list(grammar.Nonterminals)
-        nonterms.sort()
-        for nonterm in nonterms:
-            debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]]))
-        debuglog.info("")
-
-    if check_recursion:
-        unreachable = grammar.find_unreachable()
-        for u in unreachable:
-            errorlog.warning("Symbol '%s' is unreachable",u)
-
-        infinite = grammar.infinite_cycles()
-        for inf in infinite:
-            errorlog.error("Infinite recursion detected for symbol '%s'", inf)
-            errors = 1
-        
-    unused_prec = grammar.unused_precedence()
-    for term, assoc in unused_prec:
-        errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term)
-        errors = 1
-
-    if errors:
-        raise YaccError("Unable to build parser")
-    
-    # Run the LRGeneratedTable on the grammar
-    if debug:
-        errorlog.debug("Generating %s tables", method)
-            
-    lr = LRGeneratedTable(grammar,method,debuglog)
-
-    if debug:
-        num_sr = len(lr.sr_conflicts)
-
-        # Report shift/reduce and reduce/reduce conflicts
-        if num_sr == 1:
-            errorlog.warning("1 shift/reduce conflict")
-        elif num_sr > 1:
-            errorlog.warning("%d shift/reduce conflicts", num_sr)
-
-        num_rr = len(lr.rr_conflicts)
-        if num_rr == 1:
-            errorlog.warning("1 reduce/reduce conflict")
-        elif num_rr > 1:
-            errorlog.warning("%d reduce/reduce conflicts", num_rr)
-
-    # Write out conflicts to the output file
-    if debug and (lr.sr_conflicts or lr.rr_conflicts):
-        debuglog.warning("")
-        debuglog.warning("Conflicts:")
-        debuglog.warning("")
-
-        for state, tok, resolution in lr.sr_conflicts:
-            debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s",  tok, state, resolution)
-        
-        already_reported = {}
-        for state, rule, rejected in lr.rr_conflicts:
-            if (state,id(rule),id(rejected)) in already_reported:
-                continue
-            debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule)
-            debuglog.warning("rejected rule (%s) in state %d", rejected,state)
-            errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule)
-            errorlog.warning("rejected rule (%s) in state %d", rejected, state)
-            already_reported[state,id(rule),id(rejected)] = 1
-        
-        warned_never = []
-        for state, rule, rejected in lr.rr_conflicts:
-            if not rejected.reduced and (rejected not in warned_never):
-                debuglog.warning("Rule (%s) is never reduced", rejected)
-                errorlog.warning("Rule (%s) is never reduced", rejected)
-                warned_never.append(rejected)
-
-    # Write the table file if requested
-    if write_tables:
-        lr.write_table(tabmodule,outputdir,signature)
-
-    # Write a pickled version of the tables
-    if picklefile:
-        lr.pickle_table(picklefile,signature)
-
-    # Build the parser
-    lr.bind_callables(pinfo.pdict)
-    parser = LRParser(lr,pinfo.error_func)
-
-    parse = parser.parse
-    return parser
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/plyparser.py b/Linux_i686/lib/python3.4/site-packages/pycparser/plyparser.py
deleted file mode 100644
index cf327ab..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/plyparser.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#-----------------------------------------------------------------
-# plyparser.py
-#
-# PLYParser class and other utilites for simplifying programming
-# parsers with PLY
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-
-
-class Coord(object):
-    """ Coordinates of a syntactic element. Consists of:
-            - File name
-            - Line number
-            - (optional) column number, for the Lexer
-    """
-    def __init__(self, file, line, column=None):
-        self.file = file
-        self.line = line
-        self.column = column
-
-    def __str__(self):
-        str = "%s:%s" % (self.file, self.line)
-        if self.column: str += ":%s" % self.column
-        return str
-
-
-class ParseError(Exception): pass
-
-
-class PLYParser(object):
-    def _create_opt_rule(self, rulename):
-        """ Given a rule name, creates an optional ply.yacc rule
-            for it. The name of the optional rule is
-            _opt
-        """
-        optname = rulename + '_opt'
-
-        def optrule(self, p):
-            p[0] = p[1]
-
-        optrule.__doc__ = '%s : empty\n| %s' % (optname, rulename)
-        optrule.__name__ = 'p_%s' % optname
-        setattr(self.__class__, optrule.__name__, optrule)
-
-    def _coord(self, lineno, column=None):
-        return Coord(
-                file=self.clex.filename,
-                line=lineno,
-                column=column)
-
-    def _parse_error(self, msg, coord):
-        raise ParseError("%s: %s" % (coord, msg))
-
diff --git a/Linux_i686/lib/python3.4/site-packages/pycparser/yacctab.py b/Linux_i686/lib/python3.4/site-packages/pycparser/yacctab.py
deleted file mode 100644
index f14693b..0000000
--- a/Linux_i686/lib/python3.4/site-packages/pycparser/yacctab.py
+++ /dev/null
@@ -1,286 +0,0 @@
-
-# yacctab.py
-# This file is automatically generated. Do not edit.
-_tabversion = '3.2'
-
-_lr_method = 'LALR'
-
-_lr_signature = '"\xce\xf2\x9e\xca\x17\xf7\xe0\x81\x1f\r\xc4\x0b+;\x87'
-    
-_lr_action_items = {'VOID':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[6,6,-61,-72,-71,-58,-54,-55,-33,-29,-59,6,-34,-53,-68,-63,-52,6,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,6,-67,6,-70,-74,6,-57,-84,-255,-83,6,-111,-110,-30,6,-100,-99,6,6,-45,-46,6,-113,6,6,6,6,-90,6,6,6,6,-36,6,-47,6,6,-85,-91,-256,6,-114,6,6,-115,-117,-116,6,-101,-37,-39,-42,-38,-40,6,-152,-151,-43,-153,-41,-87,-86,-92,-93,6,-103,-102,-171,-170,6,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'LBRACKET':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,24,25,27,28,29,30,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,60,64,65,67,68,69,70,74,78,81,83,84,86,90,94,96,97,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,136,145,146,150,154,163,164,171,173,174,175,176,177,197,200,201,203,207,213,217,238,239,249,252,253,257,263,264,265,293,295,296,305,306,307,308,311,315,319,320,343,344,347,350,352,354,355,356,377,378,384,386,411,412,419,],[-257,-61,-72,-71,-58,-54,-55,-59,-257,-53,-68,-63,-52,-56,-174,62,-66,-257,-69,72,-73,-112,-64,-60,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-255,-83,-49,62,-100,-99,-26,-118,-120,-25,72,72,161,-48,-51,72,-113,-257,-257,72,-239,-249,-253,-250,-247,-237,-238,205,-246,-224,-243,-251,-244,-236,-248,-245,72,-121,-119,161,259,72,72,-85,-256,-21,-82,-22,-81,-254,-252,-233,-232,-114,-115,72,-117,-116,-101,-146,-148,-136,259,-150,-144,-243,-87,-86,-231,-230,-229,-228,-227,-240,72,72,-103,-102,-139,259,-137,-145,-147,-149,-225,-226,259,-138,259,-234,-235,]),'WCHAR_CONST':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,103,103,103,-45,-223,103,-221,103,-220,103,-219,103,103,-218,-222,-219,103,-257,-219,103,103,-256,103,-180,-183,-181,-177,-178,-182,-184,103,-186,-187,-179,-185,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,-12,103,103,-11,-219,-39,-42,-38,103,-40,103,103,-152,-151,-43,-153,103,-41,103,103,103,-257,-135,-171,-170,103,-168,103,103,-154,103,-167,-155,103,103,103,103,-257,103,103,-166,-169,103,-158,103,-156,103,103,-157,103,103,103,-257,103,-162,-161,-159,103,103,103,-163,-160,103,-165,-164,]),'FLOAT_CONST':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,104,104,104,-45,-223,104,-221,104,-220,104,-219,104,104,-218,-222,-219,104,-257,-219,104,104,-256,104,-180,-183,-181,-177,-178,-182,-184,104,-186,-187,-179,-185,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,-12,104,104,-11,-219,-39,-42,-38,104,-40,104,104,-152,-151,-43,-153,104,-41,104,104,104,-257,-135,-171,-170,104,-168,104,104,-154,104,-167,-155,104,104,104,104,-257,104,104,-166,-169,104,-158,104,-156,104,104,-157,104,104,104,-257,104,-162,-161,-159,104,104,104,-163,-160,104,-165,-164,]),'MINUS':([55,62,72,77,82,98,99,100,101,102,103,104,105,106,107,108,109,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,203,205,206,208,209,210,211,212,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,293,302,305,306,307,308,311,315,316,317,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,350,353,358,359,361,362,363,364,367,368,369,371,372,373,376,377,378,379,380,383,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[-255,107,107,107,-45,-223,-210,-239,-249,-253,-250,-247,-237,107,-221,-238,-212,-191,107,-220,107,-246,-219,-224,107,107,-243,-251,-218,-244,-236,222,-248,-245,-222,-219,107,-257,-219,107,107,-256,107,-180,-183,-181,-177,-178,-182,-184,107,-186,-187,-179,-185,-254,107,-216,-252,-233,-232,107,107,107,-210,-215,107,-213,-214,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,-12,107,107,-11,-219,-39,-42,-38,107,-40,107,107,-152,-151,-43,-153,107,-41,-243,107,-231,-230,-229,-228,-227,-240,107,107,222,222,222,-196,222,222,222,-195,222,222,-193,-192,222,222,222,222,222,-194,-257,-135,-171,-170,107,-168,107,107,-154,107,-167,-155,107,107,-217,-225,-226,107,107,-211,-257,107,107,-166,-169,107,-158,107,-156,107,107,-157,107,107,107,-257,-234,107,-162,-161,-159,-235,107,107,107,-163,-160,107,-165,-164,]),'RPAREN':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,24,25,27,28,29,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,53,54,56,58,59,60,63,64,65,67,68,69,70,74,78,81,83,84,90,94,96,99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,130,132,133,134,135,136,137,138,139,145,146,150,157,158,159,160,162,163,164,171,173,174,175,176,177,197,199,200,201,203,206,207,209,210,212,213,214,215,216,217,218,238,239,240,241,242,243,249,252,253,264,265,268,278,295,296,303,304,305,306,307,308,310,311,312,313,314,315,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,354,355,356,366,376,377,378,382,383,394,396,399,400,402,412,414,417,419,420,421,424,],[-257,-61,-72,-71,-58,-54,-55,-59,-257,-53,-68,-63,-52,-56,-174,-109,-66,-257,-69,-73,-112,-64,-60,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,90,-84,-83,-49,-111,-110,-257,-100,-99,-26,-118,-120,-25,-141,-257,-143,-48,-51,-113,-257,-257,-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,-189,-248,-245,-175,238,-15,239,-124,-257,-16,-122,-128,-121,-119,-142,-19,-20,264,265,-257,-141,-257,-85,-256,-21,-82,-22,-81,-254,-216,-252,-233,-232,311,-114,-210,-215,-213,-115,315,317,-172,-257,-214,-117,-116,-127,-2,-126,-1,-101,-146,-148,-150,-144,356,-14,-87,-86,-176,376,-231,-230,-229,-228,-241,-227,378,380,381,-240,-140,-257,-141,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,-129,-123,-125,-103,-102,-145,-147,-149,-13,-217,-225,-226,-173,-211,406,408,410,-242,-190,-234,-257,422,-235,-257,425,428,]),'LONG':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[19,19,-61,-72,-71,-58,-54,-55,-33,-29,-59,19,-34,-53,-68,-63,-52,19,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,19,-67,19,-70,-74,19,-57,-84,-255,-83,19,-111,-110,-30,19,-100,-99,19,19,-45,-46,19,-113,19,19,19,19,-90,19,19,19,19,-36,19,-47,19,19,-85,-91,-256,19,-114,19,19,-115,-117,-116,19,-101,-37,-39,-42,-38,-40,19,-152,-151,-43,-153,-41,-87,-86,-92,-93,19,-103,-102,-171,-170,19,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'PLUS':([55,62,72,77,82,98,99,100,101,102,103,104,105,106,107,108,109,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,203,205,206,208,209,210,211,212,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,293,302,305,306,307,308,311,315,316,317,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,350,353,358,359,361,362,363,364,367,368,369,371,372,373,376,377,378,379,380,383,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[-255,113,113,113,-45,-223,-210,-239,-249,-253,-250,-247,-237,113,-221,-238,-212,-191,113,-220,113,-246,-219,-224,113,113,-243,-251,-218,-244,-236,226,-248,-245,-222,-219,113,-257,-219,113,113,-256,113,-180,-183,-181,-177,-178,-182,-184,113,-186,-187,-179,-185,-254,113,-216,-252,-233,-232,113,113,113,-210,-215,113,-213,-214,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-12,113,113,-11,-219,-39,-42,-38,113,-40,113,113,-152,-151,-43,-153,113,-41,-243,113,-231,-230,-229,-228,-227,-240,113,113,226,226,226,-196,226,226,226,-195,226,226,-193,-192,226,226,226,226,226,-194,-257,-135,-171,-170,113,-168,113,113,-154,113,-167,-155,113,113,-217,-225,-226,113,113,-211,-257,113,113,-166,-169,113,-158,113,-156,113,113,-157,113,113,113,-257,-234,113,-162,-161,-159,-235,113,113,113,-163,-160,113,-165,-164,]),'ELLIPSIS':([245,],[341,]),'GT':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,227,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,227,-198,-196,-200,227,-199,-195,-202,227,-193,-192,-201,227,227,227,227,-194,-217,-225,-226,-211,-234,-235,]),'GOTO':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,271,-256,-39,-42,-38,-40,271,-152,-151,-43,-153,271,-41,-171,-170,-168,271,-154,-167,-155,271,-166,-169,-158,271,-156,271,-157,271,271,-162,-161,-159,271,271,-163,-160,271,-165,-164,]),'ENUM':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[26,26,-61,-72,-71,-58,-54,-55,-33,-29,-59,26,-34,-53,-68,-63,-52,26,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,26,-67,26,-70,-74,26,-57,-84,-255,-83,26,-111,-110,-30,26,-100,-99,26,26,-45,-46,26,-113,26,26,26,26,-90,26,26,26,26,-36,26,-47,26,26,-85,-91,-256,26,-114,26,26,-115,-117,-116,26,-101,-37,-39,-42,-38,-40,26,-152,-151,-43,-153,-41,-87,-86,-92,-93,26,-103,-102,-171,-170,26,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'PERIOD':([55,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,154,173,197,200,201,203,257,263,293,305,306,307,308,311,315,347,350,352,377,378,384,386,411,412,419,],[-255,-239,-249,-253,-250,-247,-237,-238,204,-246,-224,-243,-251,-244,-236,-248,-245,258,-256,-254,-252,-233,-232,-136,258,-243,-231,-230,-229,-228,-227,-240,-139,258,-137,-225,-226,258,-138,258,-234,-235,]),'GE':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,231,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,231,-198,-196,-200,231,-199,-195,-202,231,-193,-192,-201,231,231,231,231,-194,-217,-225,-226,-211,-234,-235,]),'INT_CONST_DEC':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,124,124,124,-45,-223,124,-221,124,-220,124,-219,124,124,-218,-222,-219,124,-257,-219,124,124,-256,124,-180,-183,-181,-177,-178,-182,-184,124,-186,-187,-179,-185,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,-12,124,124,-11,-219,-39,-42,-38,124,-40,124,124,-152,-151,-43,-153,124,-41,124,124,124,-257,-135,-171,-170,124,-168,124,124,-154,124,-167,-155,124,124,124,124,-257,124,124,-166,-169,124,-158,124,-156,124,124,-157,124,124,124,-257,124,-162,-161,-159,124,124,124,-163,-160,124,-165,-164,]),'ARROW':([100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,200,201,203,293,305,306,307,308,311,315,377,378,412,419,],[-239,-249,-253,-250,-247,-237,-238,202,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-252,-233,-232,-243,-231,-230,-229,-228,-227,-240,-225,-226,-234,-235,]),'HEX_FLOAT_CONST':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,127,127,127,-45,-223,127,-221,127,-220,127,-219,127,127,-218,-222,-219,127,-257,-219,127,127,-256,127,-180,-183,-181,-177,-178,-182,-184,127,-186,-187,-179,-185,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,-12,127,127,-11,-219,-39,-42,-38,127,-40,127,127,-152,-151,-43,-153,127,-41,127,127,127,-257,-135,-171,-170,127,-168,127,127,-154,127,-167,-155,127,127,127,127,-257,127,127,-166,-169,127,-158,127,-156,127,127,-157,127,127,127,-257,127,-162,-161,-159,127,127,127,-163,-160,127,-165,-164,]),'DOUBLE':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[40,40,-61,-72,-71,-58,-54,-55,-33,-29,-59,40,-34,-53,-68,-63,-52,40,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,40,-67,40,-70,-74,40,-57,-84,-255,-83,40,-111,-110,-30,40,-100,-99,40,40,-45,-46,40,-113,40,40,40,40,-90,40,40,40,40,-36,40,-47,40,40,-85,-91,-256,40,-114,40,40,-115,-117,-116,40,-101,-37,-39,-42,-38,-40,40,-152,-151,-43,-153,-41,-87,-86,-92,-93,40,-103,-102,-171,-170,40,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'MINUSEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[186,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'INT_CONST_OCT':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,128,128,128,-45,-223,128,-221,128,-220,128,-219,128,128,-218,-222,-219,128,-257,-219,128,128,-256,128,-180,-183,-181,-177,-178,-182,-184,128,-186,-187,-179,-185,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,-12,128,128,-11,-219,-39,-42,-38,128,-40,128,128,-152,-151,-43,-153,128,-41,128,128,128,-257,-135,-171,-170,128,-168,128,128,-154,128,-167,-155,128,128,128,128,-257,128,128,-166,-169,128,-158,128,-156,128,128,-157,128,128,128,-257,128,-162,-161,-159,128,128,128,-163,-160,128,-165,-164,]),'TIMESEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[195,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'OR':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,236,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,236,-203,-205,-206,-194,-217,-225,-226,-211,-234,-235,]),'SHORT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[2,2,-61,-72,-71,-58,-54,-55,-33,-29,-59,2,-34,-53,-68,-63,-52,2,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,2,-67,2,-70,-74,2,-57,-84,-255,-83,2,-111,-110,-30,2,-100,-99,2,2,-45,-46,2,-113,2,2,2,2,-90,2,2,2,2,-36,2,-47,2,2,-85,-91,-256,2,-114,2,2,-115,-117,-116,2,-101,-37,-39,-42,-38,-40,2,-152,-151,-43,-153,-41,-87,-86,-92,-93,2,-103,-102,-171,-170,2,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'RETURN':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,274,-256,-39,-42,-38,-40,274,-152,-151,-43,-153,274,-41,-171,-170,-168,274,-154,-167,-155,274,-166,-169,-158,274,-156,274,-157,274,274,-162,-161,-159,274,274,-163,-160,274,-165,-164,]),'RSHIFTEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[196,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'RESTRICT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,28,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,67,69,76,78,82,87,89,90,91,92,93,94,95,96,119,145,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[32,32,-61,-72,-71,-58,-54,-55,-33,-29,-59,32,-34,-53,-68,-63,-52,32,-56,-174,-109,-66,32,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,32,-67,32,-70,-74,32,-57,-84,-255,-83,32,-111,-110,-30,32,-100,-99,32,-120,32,32,-45,-46,32,-113,32,32,32,32,-90,32,32,-121,32,32,-36,32,-47,32,32,-85,-91,-256,32,-114,32,32,-115,-117,-116,32,-101,-37,-39,-42,-38,-40,32,-152,-151,-43,-153,-41,-87,-86,-92,-93,32,-103,-102,-171,-170,32,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'STATIC':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,63,64,65,76,78,82,87,89,90,162,164,166,167,168,171,173,207,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[9,9,-61,-72,-71,-58,-54,-55,-33,-29,-59,9,-34,-53,-68,-63,-52,9,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,9,-67,9,-70,-74,9,-57,-84,-255,-83,-111,-110,-30,9,-100,-99,9,9,-45,-46,9,-113,9,9,-36,9,-47,-85,-256,-114,-115,-117,-116,9,-101,-37,-39,-42,-38,-40,9,-152,-151,-43,-153,-41,-87,-86,9,-103,-102,-171,-170,9,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'SIZEOF':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,106,106,106,-45,-223,106,-221,106,-220,106,-219,106,106,-218,-222,-219,106,-257,-219,106,106,-256,106,-180,-183,-181,-177,-178,-182,-184,106,-186,-187,-179,-185,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,-12,106,106,-11,-219,-39,-42,-38,106,-40,106,106,-152,-151,-43,-153,106,-41,106,106,106,-257,-135,-171,-170,106,-168,106,106,-154,106,-167,-155,106,106,106,106,-257,106,106,-166,-169,106,-158,106,-156,106,106,-157,106,106,106,-257,106,-162,-161,-159,106,106,106,-163,-160,106,-165,-164,]),'UNSIGNED':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[18,18,-61,-72,-71,-58,-54,-55,-33,-29,-59,18,-34,-53,-68,-63,-52,18,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,18,-67,18,-70,-74,18,-57,-84,-255,-83,18,-111,-110,-30,18,-100,-99,18,18,-45,-46,18,-113,18,18,18,18,-90,18,18,18,18,-36,18,-47,18,18,-85,-91,-256,18,-114,18,18,-115,-117,-116,18,-101,-37,-39,-42,-38,-40,18,-152,-151,-43,-153,-41,-87,-86,-92,-93,18,-103,-102,-171,-170,18,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'UNION':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[20,20,-61,-72,-71,-58,-54,-55,-33,-29,-59,20,-34,-53,-68,-63,-52,20,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,20,-67,20,-70,-74,20,-57,-84,-255,-83,20,-111,-110,-30,20,-100,-99,20,20,-45,-46,20,-113,20,20,20,20,-90,20,20,20,20,-36,20,-47,20,20,-85,-91,-256,20,-114,20,20,-115,-117,-116,20,-101,-37,-39,-42,-38,-40,20,-152,-151,-43,-153,-41,-87,-86,-92,-93,20,-103,-102,-171,-170,20,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'COLON':([2,3,5,6,13,18,19,24,25,27,29,32,33,35,37,39,40,43,45,46,54,56,59,60,64,65,90,94,96,97,99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,130,171,173,174,175,176,177,184,197,199,200,201,203,207,209,210,212,213,216,218,238,239,249,279,293,295,296,298,299,303,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,343,344,365,376,377,378,382,383,402,412,419,],[-61,-72,-71,-58,-59,-68,-63,-174,-109,-66,-69,-73,-112,-64,-60,-62,-65,-67,-70,-74,-84,-83,-111,-110,-100,-99,-113,-257,-257,178,-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,-189,-248,-245,-175,-85,-256,-21,-82,-22,-81,302,-254,-216,-252,-233,-232,-114,-210,-215,-213,-115,-172,-214,-117,-116,-101,363,372,-87,-86,-188,178,-176,-231,-230,-229,-228,-227,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,385,-206,-194,-103,-102,395,-217,-225,-226,-173,-211,-190,-234,-235,]),'$end':([0,8,11,12,15,22,31,36,38,47,61,82,166,173,255,371,],[-257,0,-33,-29,-34,-27,-32,-31,-35,-28,-30,-45,-36,-256,-37,-155,]),'WSTRING_LITERAL':([55,62,72,77,82,98,100,102,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,102,102,102,-45,-223,197,-253,102,-221,102,-220,102,-219,102,102,-218,-222,-219,102,-257,-219,102,102,-256,102,-180,-183,-181,-177,-178,-182,-184,102,-186,-187,-179,-185,-254,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,-12,102,102,-11,-219,-39,-42,-38,102,-40,102,102,-152,-151,-43,-153,102,-41,102,102,102,-257,-135,-171,-170,102,-168,102,102,-154,102,-167,-155,102,102,102,102,-257,102,102,-166,-169,102,-158,102,-156,102,102,-157,102,102,102,-257,102,-162,-161,-159,102,102,102,-163,-160,102,-165,-164,]),'DIVIDE':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,229,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,229,229,229,229,229,229,229,229,229,229,-193,-192,229,229,229,229,229,-194,-217,-225,-226,-211,-234,-235,]),'FOR':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,276,-256,-39,-42,-38,-40,276,-152,-151,-43,-153,276,-41,-171,-170,-168,276,-154,-167,-155,276,-166,-169,-158,276,-156,276,-157,276,276,-162,-161,-159,276,276,-163,-160,276,-165,-164,]),'PLUSPLUS':([55,62,72,77,82,98,100,101,102,103,104,105,106,107,108,109,112,113,115,116,117,118,119,120,121,122,123,124,125,127,128,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,203,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,293,302,305,306,307,308,311,315,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,377,378,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[-255,115,115,115,-45,-223,-239,-249,-253,-250,-247,-237,115,-221,-238,203,115,-220,115,-246,-219,-224,115,115,-243,-251,-218,-244,-236,-248,-245,-222,-219,115,-257,-219,115,115,-256,115,-180,-183,-181,-177,-178,-182,-184,115,-186,-187,-179,-185,-254,115,-252,-233,-232,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,-12,115,115,-11,-219,-39,-42,-38,115,-40,115,115,-152,-151,-43,-153,115,-41,-243,115,-231,-230,-229,-228,-227,-240,115,115,-257,-135,-171,-170,115,-168,115,115,-154,115,-167,-155,115,115,-225,-226,115,115,-257,115,115,-166,-169,115,-158,115,-156,115,115,-157,115,115,115,-257,-234,115,-162,-161,-159,-235,115,115,115,-163,-160,115,-165,-164,]),'EQUALS':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,24,25,27,29,30,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,54,56,58,59,60,64,65,76,83,84,86,90,99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,144,165,171,173,197,199,200,201,203,207,209,210,212,213,218,238,239,249,257,263,293,295,296,305,306,307,308,311,315,343,344,347,352,376,377,378,383,386,412,419,],[-257,-61,-72,-71,-58,-54,-55,-59,-257,-53,-68,-63,-52,-56,-174,-109,-66,-69,77,-73,-112,-64,-60,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-83,-49,-111,-110,-100,-99,151,-48,-51,77,-113,188,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,250,151,-85,-256,-254,-216,-252,-233,-232,-114,-210,-215,-213,-115,-214,-117,-116,-101,-136,353,-243,-87,-86,-231,-230,-229,-228,-227,-240,-103,-102,-139,-137,-217,-225,-226,-211,-138,-234,-235,]),'ELSE':([173,269,270,273,275,286,291,358,359,362,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[-256,-39,-42,-38,-40,-43,-41,-171,-170,-168,-167,-155,-166,-169,-158,-156,-157,-162,-161,423,-163,-160,-165,-164,]),'ANDEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[193,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'EQ':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,233,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,233,-198,-196,-200,-204,-199,-195,-202,233,-193,-192,-201,233,-203,233,233,-194,-217,-225,-226,-211,-234,-235,]),'AND':([55,62,72,77,82,98,99,100,101,102,103,104,105,106,107,108,109,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,203,205,206,208,209,210,211,212,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,293,302,305,306,307,308,311,315,316,317,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,350,353,358,359,361,362,363,364,367,368,369,371,372,373,376,377,378,379,380,383,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[-255,123,123,123,-45,-223,-210,-239,-249,-253,-250,-247,-237,123,-221,-238,-212,-191,123,-220,123,-246,-219,-224,123,123,-243,-251,-218,-244,-236,234,-248,-245,-222,-219,123,-257,-219,123,123,-256,123,-180,-183,-181,-177,-178,-182,-184,123,-186,-187,-179,-185,-254,123,-216,-252,-233,-232,123,123,123,-210,-215,123,-213,-214,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,-12,123,123,-11,-219,-39,-42,-38,123,-40,123,123,-152,-151,-43,-153,123,-41,-243,123,-231,-230,-229,-228,-227,-240,123,123,-197,234,-198,-196,-200,-204,-199,-195,-202,234,-193,-192,-201,234,-203,-205,234,-194,-257,-135,-171,-170,123,-168,123,123,-154,123,-167,-155,123,123,-217,-225,-226,123,123,-211,-257,123,123,-166,-169,123,-158,123,-156,123,123,-157,123,123,123,-257,-234,123,-162,-161,-159,-235,123,123,123,-163,-160,123,-165,-164,]),'TYPEID':([0,1,2,3,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,31,32,33,34,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,67,68,69,70,74,76,78,82,87,89,90,91,92,93,94,95,96,119,145,146,162,163,164,166,167,168,169,170,171,172,173,198,202,204,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[24,24,-61,-72,-71,-58,54,-54,-55,-33,-29,-59,24,-34,59,-53,-68,-63,-89,-52,24,-56,-174,-109,64,-66,-257,-69,-32,-73,-112,-88,-64,-31,-60,-35,-62,-65,24,-67,24,-70,-74,24,-57,-84,-255,-83,24,-111,-110,-30,24,-100,-99,-26,-118,-120,-25,59,24,24,-45,-46,24,-113,24,24,24,24,-90,24,24,-121,-119,24,59,24,-36,24,-47,24,24,-85,-91,-256,24,305,307,-114,24,24,-115,-117,-116,24,-101,-37,-39,-42,-38,-40,24,-152,-151,-43,-153,-41,-87,-86,-92,-93,24,-103,-102,-171,-170,24,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'LBRACE':([7,20,25,26,33,34,48,54,55,56,59,60,64,65,76,77,82,85,87,88,89,90,151,152,154,167,168,173,207,213,238,239,256,260,261,269,270,273,275,282,284,285,286,288,290,291,317,350,353,358,359,362,363,367,369,371,372,376,380,381,384,387,389,390,393,395,398,406,407,408,410,411,415,416,418,423,425,426,427,428,429,430,],[55,-89,-109,55,-112,-88,-257,55,-255,55,-111,-110,55,55,-257,55,-45,-7,-46,55,-8,-113,55,55,-257,55,-47,-256,-114,-115,-117,-116,-12,55,-11,-39,-42,-38,-40,55,-152,-151,-43,-153,55,-41,55,-257,-135,-171,-170,-168,55,-154,-167,-155,55,55,55,55,-257,55,-166,-169,-158,55,-156,55,-157,55,55,-257,-162,-161,-159,55,55,-163,-160,55,-165,-164,]),'PPHASH':([0,11,12,15,22,31,36,38,61,82,166,173,255,371,],[38,-33,-29,-34,38,-32,-31,-35,-30,-45,-36,-256,-37,-155,]),'INT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[39,39,-61,-72,-71,-58,-54,-55,-33,-29,-59,39,-34,-53,-68,-63,-52,39,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,39,-67,39,-70,-74,39,-57,-84,-255,-83,39,-111,-110,-30,39,-100,-99,39,39,-45,-46,39,-113,39,39,39,39,-90,39,39,39,39,-36,39,-47,39,39,-85,-91,-256,39,-114,39,39,-115,-117,-116,39,-101,-37,-39,-42,-38,-40,39,-152,-151,-43,-153,-41,-87,-86,-92,-93,39,-103,-102,-171,-170,39,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'SIGNED':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[43,43,-61,-72,-71,-58,-54,-55,-33,-29,-59,43,-34,-53,-68,-63,-52,43,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,43,-67,43,-70,-74,43,-57,-84,-255,-83,43,-111,-110,-30,43,-100,-99,43,43,-45,-46,43,-113,43,43,43,43,-90,43,43,43,43,-36,43,-47,43,43,-85,-91,-256,43,-114,43,43,-115,-117,-116,43,-101,-37,-39,-42,-38,-40,43,-152,-151,-43,-153,-41,-87,-86,-92,-93,43,-103,-102,-171,-170,43,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'CONTINUE':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,277,-256,-39,-42,-38,-40,277,-152,-151,-43,-153,277,-41,-171,-170,-168,277,-154,-167,-155,277,-166,-169,-158,277,-156,277,-157,277,277,-162,-161,-159,277,277,-163,-160,277,-165,-164,]),'NOT':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,131,131,131,-45,-223,131,-221,131,-220,131,-219,131,131,-218,-222,-219,131,-257,-219,131,131,-256,131,-180,-183,-181,-177,-178,-182,-184,131,-186,-187,-179,-185,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,-12,131,131,-11,-219,-39,-42,-38,131,-40,131,131,-152,-151,-43,-153,131,-41,131,131,131,-257,-135,-171,-170,131,-168,131,131,-154,131,-167,-155,131,131,131,131,-257,131,131,-166,-169,131,-158,131,-156,131,131,-157,131,131,131,-257,131,-162,-161,-159,131,131,131,-163,-160,131,-165,-164,]),'OREQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[194,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'MOD':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,237,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,237,237,237,237,237,237,237,237,237,237,-193,-192,237,237,237,237,237,-194,-217,-225,-226,-211,-234,-235,]),'RSHIFT':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,219,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,219,-198,-196,219,219,219,-195,219,219,-193,-192,219,219,219,219,219,-194,-217,-225,-226,-211,-234,-235,]),'DEFAULT':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,279,-256,-39,-42,-38,-40,279,-152,-151,-43,-153,279,-41,-171,-170,-168,279,-154,-167,-155,279,-166,-169,-158,279,-156,279,-157,279,279,-162,-161,-159,279,279,-163,-160,279,-165,-164,]),'CHAR':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[37,37,-61,-72,-71,-58,-54,-55,-33,-29,-59,37,-34,-53,-68,-63,-52,37,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,37,-67,37,-70,-74,37,-57,-84,-255,-83,37,-111,-110,-30,37,-100,-99,37,37,-45,-46,37,-113,37,37,37,37,-90,37,37,37,37,-36,37,-47,37,37,-85,-91,-256,37,-114,37,37,-115,-117,-116,37,-101,-37,-39,-42,-38,-40,37,-152,-151,-43,-153,-41,-87,-86,-92,-93,37,-103,-102,-171,-170,37,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'WHILE':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,370,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,280,-256,-39,-42,-38,-40,280,-152,-151,-43,-153,280,-41,-171,-170,-168,280,-154,-167,397,-155,280,-166,-169,-158,280,-156,280,-157,280,280,-162,-161,-159,280,280,-163,-160,280,-165,-164,]),'DIVEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[185,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'EXTERN':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,63,64,65,76,78,82,87,89,90,162,164,166,167,168,171,173,207,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[10,10,-61,-72,-71,-58,-54,-55,-33,-29,-59,10,-34,-53,-68,-63,-52,10,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,10,-67,10,-70,-74,10,-57,-84,-255,-83,-111,-110,-30,10,-100,-99,10,10,-45,-46,10,-113,10,10,-36,10,-47,-85,-256,-114,-115,-117,-116,10,-101,-37,-39,-42,-38,-40,10,-152,-151,-43,-153,-41,-87,-86,10,-103,-102,-171,-170,10,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'CASE':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,281,-256,-39,-42,-38,-40,281,-152,-151,-43,-153,281,-41,-171,-170,-168,281,-154,-167,-155,281,-166,-169,-158,281,-156,281,-157,281,281,-162,-161,-159,281,281,-163,-160,281,-165,-164,]),'LAND':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,232,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,232,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,-217,-225,-226,-211,-234,-235,]),'REGISTER':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,63,64,65,76,78,82,87,89,90,162,164,166,167,168,171,173,207,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[17,17,-61,-72,-71,-58,-54,-55,-33,-29,-59,17,-34,-53,-68,-63,-52,17,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,17,-67,17,-70,-74,17,-57,-84,-255,-83,-111,-110,-30,17,-100,-99,17,17,-45,-46,17,-113,17,17,-36,17,-47,-85,-256,-114,-115,-117,-116,17,-101,-37,-39,-42,-38,-40,17,-152,-151,-43,-153,-41,-87,-86,17,-103,-102,-171,-170,17,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'MODEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[187,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'NE':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,224,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,224,-198,-196,-200,-204,-199,-195,-202,224,-193,-192,-201,224,-203,224,224,-194,-217,-225,-226,-211,-234,-235,]),'SWITCH':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,283,-256,-39,-42,-38,-40,283,-152,-151,-43,-153,283,-41,-171,-170,-168,283,-154,-167,-155,283,-166,-169,-158,283,-156,283,-157,283,283,-162,-161,-159,283,283,-163,-160,283,-165,-164,]),'INT_CONST_HEX':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,116,116,116,-45,-223,116,-221,116,-220,116,-219,116,116,-218,-222,-219,116,-257,-219,116,116,-256,116,-180,-183,-181,-177,-178,-182,-184,116,-186,-187,-179,-185,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,-12,116,116,-11,-219,-39,-42,-38,116,-40,116,116,-152,-151,-43,-153,116,-41,116,116,116,-257,-135,-171,-170,116,-168,116,116,-154,116,-167,-155,116,116,116,116,-257,116,116,-166,-169,116,-158,116,-156,116,116,-157,116,116,116,-257,116,-162,-161,-159,116,116,116,-163,-160,116,-165,-164,]),'_COMPLEX':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[27,27,-61,-72,-71,-58,-54,-55,-33,-29,-59,27,-34,-53,-68,-63,-52,27,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,27,-67,27,-70,-74,27,-57,-84,-255,-83,27,-111,-110,-30,27,-100,-99,27,27,-45,-46,27,-113,27,27,27,27,-90,27,27,27,27,-36,27,-47,27,27,-85,-91,-256,27,-114,27,27,-115,-117,-116,27,-101,-37,-39,-42,-38,-40,27,-152,-151,-43,-153,-41,-87,-86,-92,-93,27,-103,-102,-171,-170,27,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'PLUSEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[190,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'STRUCT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[34,34,-61,-72,-71,-58,-54,-55,-33,-29,-59,34,-34,-53,-68,-63,-52,34,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,34,-67,34,-70,-74,34,-57,-84,-255,-83,34,-111,-110,-30,34,-100,-99,34,34,-45,-46,34,-113,34,34,34,34,-90,34,34,34,34,-36,34,-47,34,34,-85,-91,-256,34,-114,34,34,-115,-117,-116,34,-101,-37,-39,-42,-38,-40,34,-152,-151,-43,-153,-41,-87,-86,-92,-93,34,-103,-102,-171,-170,34,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'CONDOP':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,235,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,-217,-225,-226,-211,-234,-235,]),'BREAK':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,287,-256,-39,-42,-38,-40,287,-152,-151,-43,-153,287,-41,-171,-170,-168,287,-154,-167,-155,287,-166,-169,-158,287,-156,287,-157,287,287,-162,-161,-159,287,287,-163,-160,287,-165,-164,]),'VOLATILE':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,28,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,67,69,76,78,82,87,89,90,91,92,93,94,95,96,119,145,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[46,46,-61,-72,-71,-58,-54,-55,-33,-29,-59,46,-34,-53,-68,-63,-52,46,-56,-174,-109,-66,46,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,46,-67,46,-70,-74,46,-57,-84,-255,-83,46,-111,-110,-30,46,-100,-99,46,-120,46,46,-45,-46,46,-113,46,46,46,46,-90,46,46,-121,46,46,-36,46,-47,46,46,-85,-91,-256,46,-114,46,46,-115,-117,-116,46,-101,-37,-39,-42,-38,-40,46,-152,-151,-43,-153,-41,-87,-86,-92,-93,46,-103,-102,-171,-170,46,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'INLINE':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,63,64,65,76,78,82,87,89,90,162,164,166,167,168,171,173,207,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[49,49,-61,-72,-71,-58,-54,-55,-33,-29,-59,49,-34,-53,-68,-63,-52,49,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,49,-67,49,-70,-74,49,-57,-84,-255,-83,-111,-110,-30,49,-100,-99,49,49,-45,-46,49,-113,49,49,-36,49,-47,-85,-256,-114,-115,-117,-116,49,-101,-37,-39,-42,-38,-40,49,-152,-151,-43,-153,-41,-87,-86,49,-103,-102,-171,-170,49,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'DO':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,290,-256,-39,-42,-38,-40,290,-152,-151,-43,-153,290,-41,-171,-170,-168,290,-154,-167,-155,290,-166,-169,-158,290,-156,290,-157,290,290,-162,-161,-159,290,290,-163,-160,290,-165,-164,]),'LNOT':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,98,98,98,-45,-223,98,-221,98,-220,98,-219,98,98,-218,-222,-219,98,-257,-219,98,98,-256,98,-180,-183,-181,-177,-178,-182,-184,98,-186,-187,-179,-185,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,-12,98,98,-11,-219,-39,-42,-38,98,-40,98,98,-152,-151,-43,-153,98,-41,98,98,98,-257,-135,-171,-170,98,-168,98,98,-154,98,-167,-155,98,98,98,98,-257,98,98,-166,-169,98,-158,98,-156,98,98,-157,98,98,98,-257,98,-162,-161,-159,98,98,98,-163,-160,98,-165,-164,]),'CONST':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,28,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,67,69,76,78,82,87,89,90,91,92,93,94,95,96,119,145,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[3,3,-61,-72,-71,-58,-54,-55,-33,-29,-59,3,-34,-53,-68,-63,-52,3,-56,-174,-109,-66,3,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,3,-67,3,-70,-74,3,-57,-84,-255,-83,3,-111,-110,-30,3,-100,-99,3,-120,3,3,-45,-46,3,-113,3,3,3,3,-90,3,3,-121,3,3,-36,3,-47,3,3,-85,-91,-256,3,-114,3,3,-115,-117,-116,3,-101,-37,-39,-42,-38,-40,3,-152,-151,-43,-153,-41,-87,-86,-92,-93,3,-103,-102,-171,-170,3,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'LOR':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,220,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,-217,-225,-226,-211,-234,-235,]),'CHAR_CONST':([55,62,72,77,82,98,106,107,112,113,115,117,119,120,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,101,101,101,-45,-223,101,-221,101,-220,101,-219,101,101,-218,-222,-219,101,-257,-219,101,101,-256,101,-180,-183,-181,-177,-178,-182,-184,101,-186,-187,-179,-185,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,-12,101,101,-11,-219,-39,-42,-38,101,-40,101,101,-152,-151,-43,-153,101,-41,101,101,101,-257,-135,-171,-170,101,-168,101,101,-154,101,-167,-155,101,101,101,101,-257,101,101,-166,-169,101,-158,101,-156,101,101,-157,101,101,101,-257,101,-162,-161,-159,101,101,101,-163,-160,101,-165,-164,]),'LSHIFT':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,221,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,221,-198,-196,221,221,221,-195,221,221,-193,-192,221,221,221,221,221,-194,-217,-225,-226,-211,-234,-235,]),'RBRACE':([55,82,93,95,99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,130,142,143,144,155,167,169,170,172,173,197,199,200,201,203,209,210,212,218,246,247,248,262,269,270,273,275,282,284,285,286,288,289,291,292,298,300,301,303,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,345,346,349,350,351,358,359,362,367,369,371,376,377,378,383,388,389,390,393,398,401,402,403,407,411,412,415,416,418,419,426,427,429,430,],[-255,-45,173,-90,-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,-189,-248,-245,-175,-104,173,-107,-130,-257,173,173,-91,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,173,173,-105,173,-39,-42,-38,-40,-6,-152,-151,-43,-153,-5,-41,173,-188,-92,-93,-176,-231,-230,-229,-228,-227,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,-106,-108,-133,173,-131,-171,-170,-168,-154,-167,-155,-217,-225,-226,-211,-132,-166,-169,-158,-156,173,-190,-134,-157,173,-234,-162,-161,-159,-235,-163,-160,-165,-164,]),'_BOOL':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[13,13,-61,-72,-71,-58,-54,-55,-33,-29,-59,13,-34,-53,-68,-63,-52,13,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,13,-67,13,-70,-74,13,-57,-84,-255,-83,13,-111,-110,-30,13,-100,-99,13,13,-45,-46,13,-113,13,13,13,13,-90,13,13,13,13,-36,13,-47,13,13,-85,-91,-256,13,-114,13,13,-115,-117,-116,13,-101,-37,-39,-42,-38,-40,13,-152,-151,-43,-153,-41,-87,-86,-92,-93,13,-103,-102,-171,-170,13,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'LE':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,223,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,223,-198,-196,-200,223,-199,-195,-202,223,-193,-192,-201,223,223,223,223,-194,-217,-225,-226,-211,-234,-235,]),'SEMI':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,28,29,30,31,32,33,35,36,37,38,39,40,41,42,43,44,45,46,49,50,51,52,54,55,56,58,59,60,61,64,65,67,68,69,70,71,73,74,75,76,79,80,81,82,83,84,86,90,94,96,97,99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,130,145,146,150,153,155,163,165,166,167,171,173,174,175,176,177,179,180,181,182,183,184,197,199,200,201,203,207,209,210,212,213,216,218,238,239,249,251,252,253,254,255,264,265,269,270,272,273,274,275,277,278,282,284,285,286,287,288,289,290,291,293,295,296,297,298,303,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,343,344,351,354,355,356,357,358,359,360,361,362,363,366,367,369,371,372,374,375,376,377,378,382,383,388,389,390,391,392,393,395,398,402,404,405,406,407,408,410,412,413,415,416,418,419,422,423,425,426,427,428,429,430,],[15,-257,-61,-72,-71,-58,-54,-55,-33,-29,-59,-257,-34,-53,-68,-63,-52,15,-56,-174,-109,-66,-257,-69,-257,-32,-73,-112,-64,-31,-60,-35,-62,-65,82,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-255,-83,-49,-111,-110,-30,-100,-99,-26,-118,-120,-25,-18,-44,-141,-17,-79,-78,-75,-143,-45,-48,-51,-257,-113,-257,-257,-257,-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,-189,-248,-245,-175,-121,-119,-142,-77,-130,-141,-79,-36,-257,-85,-256,-21,-82,-22,-81,-24,300,-94,301,-23,-96,-254,-216,-252,-233,-232,-114,-210,-215,-213,-115,-172,-214,-117,-116,-101,-76,-146,-148,-80,-37,-150,-144,-39,-42,358,-38,359,-40,362,-14,-257,-152,-151,-43,369,-153,-13,-257,-41,-243,-87,-86,-98,-188,-176,-231,-230,-229,-228,-227,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,-103,-102,-131,-145,-147,-149,389,-171,-170,390,-257,-168,-257,-13,-154,-167,-155,-257,-95,-97,-217,-225,-226,-173,-211,-132,-166,-169,404,-257,-158,-257,-156,-190,-257,414,-257,-157,-257,-257,-234,420,-162,-161,-159,-235,426,-257,-257,-163,-160,-257,-165,-164,]),'LT':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,225,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,225,-198,-196,-200,225,-199,-195,-202,225,-193,-192,-201,225,225,225,225,-194,-217,-225,-226,-211,-234,-235,]),'COMMA':([1,2,3,5,6,9,10,13,14,17,18,19,21,23,24,25,27,28,29,32,33,35,37,39,40,42,43,44,45,46,49,50,51,52,54,56,58,59,60,64,65,67,68,69,70,71,74,76,79,80,81,83,84,90,99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,130,135,136,137,138,139,142,143,144,145,146,150,153,155,163,165,171,173,179,181,184,197,199,200,201,203,207,209,210,212,213,214,216,218,238,239,240,241,242,243,246,247,248,249,251,252,253,254,262,264,265,278,293,295,296,297,298,303,305,306,307,308,309,310,311,312,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,342,343,344,345,346,349,351,354,355,356,360,374,375,376,377,378,382,383,388,394,396,399,400,401,402,403,412,417,419,],[-257,-61,-72,-71,-58,-54,-55,-59,-257,-53,-68,-63,-52,-56,-174,-109,-66,-257,-69,-73,-112,-64,-60,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-83,-49,-111,-110,-100,-99,-26,-118,-120,-25,147,-141,-79,-78,-75,-143,-48,-51,-113,-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,-189,-248,-245,-175,-124,-257,244,245,-128,-104,248,-107,-121,-119,-142,-77,-130,-141,-79,-85,-256,299,-94,-96,-254,-216,-252,-233,-232,-114,-210,-215,-213,-115,316,-172,-214,-117,-116,-127,-2,-126,-1,248,248,-105,-101,-76,-146,-148,-80,350,-150,-144,316,-243,-87,-86,-98,-188,-176,-231,-230,-229,-228,316,-241,-227,379,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,316,-206,-194,-129,-125,-103,-102,-106,-108,-133,-131,-145,-147,-149,316,-95,-97,-217,-225,-226,-173,-211,-132,316,316,316,-242,411,-190,-134,-234,316,-235,]),'TYPEDEF':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,63,64,65,76,78,82,87,89,90,162,164,166,167,168,171,173,207,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[23,23,-61,-72,-71,-58,-54,-55,-33,-29,-59,23,-34,-53,-68,-63,-52,23,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,23,-67,23,-70,-74,23,-57,-84,-255,-83,-111,-110,-30,23,-100,-99,23,23,-45,-46,23,-113,23,23,-36,23,-47,-85,-256,-114,-115,-117,-116,23,-101,-37,-39,-42,-38,-40,23,-152,-151,-43,-153,-41,-87,-86,23,-103,-102,-171,-170,23,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'XOR':([99,100,101,102,103,104,105,108,109,111,116,118,121,122,124,125,126,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,376,377,378,383,412,419,],[-210,-239,-249,-253,-250,-247,-237,-238,-212,-191,-246,-224,-243,-251,-244,-236,228,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-197,228,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,228,-203,-205,228,-194,-217,-225,-226,-211,-234,-235,]),'AUTO':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,59,60,61,63,64,65,76,78,82,87,89,90,162,164,166,167,168,171,173,207,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[21,21,-61,-72,-71,-58,-54,-55,-33,-29,-59,21,-34,-53,-68,-63,-52,21,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,21,-67,21,-70,-74,21,-57,-84,-255,-83,-111,-110,-30,21,-100,-99,21,21,-45,-46,21,-113,21,21,-36,21,-47,-85,-256,-114,-115,-117,-116,21,-101,-37,-39,-42,-38,-40,21,-152,-151,-43,-153,-41,-87,-86,21,-103,-102,-171,-170,21,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'TIMES':([0,1,2,3,4,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,27,28,29,30,31,32,35,36,37,38,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,61,62,64,65,67,68,69,70,72,77,78,82,83,84,86,94,96,97,98,99,100,101,102,103,104,105,106,107,108,109,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,131,136,145,147,149,151,154,156,161,164,166,167,171,173,174,175,176,177,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,203,205,206,208,209,210,211,212,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,249,250,255,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,293,295,296,299,302,305,306,307,308,311,315,316,317,319,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,343,344,350,353,358,359,361,362,363,364,367,368,369,371,372,373,376,377,378,379,380,383,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[28,-257,-61,-72,28,-71,-58,-54,-55,-33,-29,-59,-257,-34,-53,-68,-63,-52,28,-56,-174,-66,-257,-69,28,-32,-73,-64,-31,-60,-35,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-255,-83,-49,-30,117,-100,-99,-26,28,-120,-25,149,156,28,-45,-48,-51,28,-257,-257,28,-223,-210,-239,-249,-253,-250,-247,-237,156,-221,-238,-212,-191,156,-220,156,-246,-219,-224,156,156,-243,-251,-218,-244,-236,230,-248,-245,-222,28,-121,28,-219,156,-257,-219,267,28,-36,156,-85,-256,-21,-82,-22,-81,156,-180,-183,-181,-177,-178,-182,-184,156,-186,-187,-179,-185,-254,156,-216,-252,-233,-232,156,156,156,-210,-215,156,-213,28,-214,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,-101,156,-37,-12,156,156,-11,-219,-39,-42,-38,156,-40,156,156,-152,-151,-43,-153,156,-41,-243,-87,-86,28,156,-231,-230,-229,-228,-227,-240,156,156,28,230,230,230,230,230,230,230,230,230,230,-193,-192,230,230,230,230,230,-194,-103,-102,-257,-135,-171,-170,156,-168,156,156,-154,156,-167,-155,156,156,-217,-225,-226,156,156,-211,-257,156,156,-166,-169,156,-158,156,-156,156,156,-157,156,156,156,-257,-234,156,-162,-161,-159,-235,156,156,156,-163,-160,156,-165,-164,]),'LPAREN':([0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,17,18,19,21,22,23,24,25,27,28,29,30,31,32,33,35,36,37,38,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,60,61,62,64,65,67,68,69,70,72,74,77,78,81,82,83,84,86,90,94,96,97,98,100,101,102,103,104,105,106,107,108,109,112,113,115,116,117,118,119,120,121,122,123,124,125,127,128,131,136,145,146,147,149,150,151,154,156,161,163,164,166,167,171,173,174,175,176,177,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,203,205,206,207,208,211,213,217,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,249,250,252,253,255,256,259,260,261,264,265,267,269,270,273,274,275,276,280,281,282,283,284,285,286,288,290,291,293,294,295,296,299,302,305,306,307,308,311,315,316,317,319,320,343,344,350,353,354,355,356,358,359,361,362,363,364,367,368,369,371,372,373,377,378,379,380,384,385,387,389,390,392,393,395,397,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[4,-257,-61,-72,4,-71,-58,-54,-55,-33,-29,-59,-257,-34,4,-53,-68,-63,-52,4,-56,-174,63,-66,-257,-69,78,-32,-73,-112,-64,-31,-60,-35,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-255,-83,-49,63,-30,119,-100,-99,-26,-118,-120,-25,119,78,119,78,162,-45,-48,-51,164,-113,-257,-257,164,-223,-239,-249,-253,-250,-247,-237,198,-221,-238,206,208,-220,211,-246,-219,-224,119,211,-243,-251,-218,-244,-236,-248,-245,-222,78,-121,-119,4,-219,162,119,-257,-219,119,164,164,-36,119,-85,-256,-21,-82,-22,-81,208,-180,-183,-181,-177,-178,-182,-184,119,-186,-187,-179,-185,-254,119,-252,-233,-232,119,119,-114,119,119,-115,319,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,119,208,208,-117,-116,-101,208,-146,-148,-37,-12,208,119,-11,-150,-144,-219,-39,-42,-38,119,-40,361,364,208,119,368,-152,-151,-43,-153,119,-41,-243,373,-87,-86,4,208,-231,-230,-229,-228,-227,-240,119,208,319,319,-103,-102,-257,-135,-145,-147,-149,-171,-170,119,-168,119,119,-154,119,-167,-155,119,119,-225,-226,119,208,-257,208,119,-166,-169,119,-158,119,409,-156,119,119,-157,119,119,119,-257,-234,119,-162,-161,-159,-235,119,119,119,-163,-160,119,-165,-164,]),'MINUSMINUS':([55,62,72,77,82,98,100,101,102,103,104,105,106,107,108,109,112,113,115,116,117,118,119,120,121,122,123,124,125,127,128,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,203,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,293,302,305,306,307,308,311,315,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,377,378,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,412,414,415,416,418,419,420,423,425,426,427,428,429,430,],[-255,120,120,120,-45,-223,-239,-249,-253,-250,-247,-237,120,-221,-238,201,120,-220,120,-246,-219,-224,120,120,-243,-251,-218,-244,-236,-248,-245,-222,-219,120,-257,-219,120,120,-256,120,-180,-183,-181,-177,-178,-182,-184,120,-186,-187,-179,-185,-254,120,-252,-233,-232,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-12,120,120,-11,-219,-39,-42,-38,120,-40,120,120,-152,-151,-43,-153,120,-41,-243,120,-231,-230,-229,-228,-227,-240,120,120,-257,-135,-171,-170,120,-168,120,120,-154,120,-167,-155,120,120,-225,-226,120,120,-257,120,120,-166,-169,120,-158,120,-156,120,120,-157,120,120,120,-257,-234,120,-162,-161,-159,-235,120,120,120,-163,-160,120,-165,-164,]),'ID':([0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,38,39,40,42,43,44,45,46,49,50,51,52,54,55,56,58,61,62,63,64,65,66,67,68,69,70,72,74,77,78,82,83,84,86,94,96,97,98,106,107,112,113,115,117,119,120,123,131,136,140,141,145,146,147,149,151,154,156,161,163,164,166,167,171,173,174,175,176,177,178,185,186,187,188,189,190,191,192,193,194,195,196,198,202,204,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,244,248,249,250,255,256,258,259,260,261,267,269,270,271,273,274,275,281,282,284,285,286,288,290,291,295,296,299,302,316,317,343,344,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[33,-257,-61,-72,33,-71,-58,56,-54,-55,-33,-29,-59,-257,-34,33,-53,-68,-63,-89,-52,33,-56,-174,65,-66,-257,-69,33,-32,-73,-88,-64,-31,-60,-35,-62,-65,-257,-67,-257,-70,-74,-57,-50,-9,-10,-84,-255,-83,-49,-30,121,121,-100,-99,144,-26,-118,-120,-25,121,33,121,33,-45,-48,-51,33,-257,-257,33,-223,121,-221,121,-220,121,-219,121,121,-218,-222,33,144,144,-121,-119,33,-219,121,-257,-219,121,33,33,-36,293,-85,-256,-21,-82,-22,-81,121,-180,-183,-181,-177,-178,-182,-184,121,-186,-187,-179,-185,121,306,308,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,144,-101,121,-37,-12,121,121,121,-11,-219,-39,-42,357,-38,121,-40,121,293,-152,-151,-43,-153,293,-41,-87,-86,33,121,121,121,-103,-102,-257,-135,-171,-170,121,-168,293,121,-154,121,-167,-155,293,121,121,121,-257,121,121,-166,-169,121,-158,293,-156,121,293,-157,293,121,293,-257,121,-162,-161,-159,121,293,293,-163,-160,293,-165,-164,]),'IF':([55,82,167,173,269,270,273,275,282,284,285,286,288,290,291,358,359,362,363,367,369,371,372,389,390,393,395,398,406,407,408,410,415,416,418,423,425,426,427,428,429,430,],[-255,-45,294,-256,-39,-42,-38,-40,294,-152,-151,-43,-153,294,-41,-171,-170,-168,294,-154,-167,-155,294,-166,-169,-158,294,-156,294,-157,294,294,-162,-161,-159,294,294,-163,-160,294,-165,-164,]),'STRING_LITERAL':([55,62,72,77,82,98,106,107,108,112,113,115,117,119,120,122,123,131,149,151,154,156,161,167,173,178,185,186,187,188,189,190,191,192,193,194,195,196,198,200,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,256,259,260,261,267,269,270,273,274,275,281,282,284,285,286,288,290,291,302,316,317,350,353,358,359,361,362,363,364,367,368,369,371,372,373,379,380,384,385,387,389,390,392,393,395,398,404,406,407,408,409,410,411,414,415,416,418,420,423,425,426,427,428,429,430,],[-255,122,122,122,-45,-223,122,-221,200,122,-220,122,-219,122,122,-251,-218,-222,-219,122,-257,-219,122,122,-256,122,-180,-183,-181,-177,-178,-182,-184,122,-186,-187,-179,-185,122,-252,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,-12,122,122,-11,-219,-39,-42,-38,122,-40,122,122,-152,-151,-43,-153,122,-41,122,122,122,-257,-135,-171,-170,122,-168,122,122,-154,122,-167,-155,122,122,122,122,-257,122,122,-166,-169,122,-158,122,-156,122,122,-157,122,122,122,-257,122,-162,-161,-159,122,122,122,-163,-160,122,-165,-164,]),'FLOAT':([0,1,2,3,5,6,9,10,11,12,13,14,15,17,18,19,21,22,23,24,25,27,29,31,32,33,35,36,37,38,39,40,42,43,44,45,46,48,49,54,55,56,57,59,60,61,63,64,65,76,78,82,87,89,90,91,92,93,94,95,96,119,162,164,166,167,168,169,170,171,172,173,198,207,208,211,213,238,239,245,249,255,269,270,273,275,282,284,285,286,288,291,295,296,300,301,319,343,344,358,359,361,362,367,369,371,389,390,393,398,407,415,416,418,426,427,429,430,],[35,35,-61,-72,-71,-58,-54,-55,-33,-29,-59,35,-34,-53,-68,-63,-52,35,-56,-174,-109,-66,-69,-32,-73,-112,-64,-31,-60,-35,-62,-65,35,-67,35,-70,-74,35,-57,-84,-255,-83,35,-111,-110,-30,35,-100,-99,35,35,-45,-46,35,-113,35,35,35,35,-90,35,35,35,35,-36,35,-47,35,35,-85,-91,-256,35,-114,35,35,-115,-117,-116,35,-101,-37,-39,-42,-38,-40,35,-152,-151,-43,-153,-41,-87,-86,-92,-93,35,-103,-102,-171,-170,35,-168,-154,-167,-155,-166,-169,-158,-156,-157,-162,-161,-159,-163,-160,-165,-164,]),'XOREQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[189,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'LSHIFTEQUAL':([99,100,101,102,103,104,105,108,109,116,118,121,122,124,125,127,128,173,197,199,200,201,203,209,210,212,218,293,305,306,307,308,311,315,376,377,378,383,412,419,],[191,-239,-249,-253,-250,-247,-237,-238,-212,-246,-224,-243,-251,-244,-236,-248,-245,-256,-254,-216,-252,-233,-232,-210,-215,-213,-214,-243,-231,-230,-229,-228,-227,-240,-217,-225,-226,-211,-234,-235,]),'RBRACKET':([62,72,99,100,101,102,103,104,105,108,109,110,111,114,116,117,118,121,122,124,125,126,127,128,129,130,148,149,161,173,197,199,200,201,203,209,210,212,216,218,266,267,298,303,305,306,307,308,309,311,315,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,348,376,377,378,382,383,402,412,419,],[-257,-257,-210,-239,-249,-253,-250,-247,-237,-238,-212,207,-191,-4,-246,213,-224,-243,-251,-244,-236,-189,-248,-245,-3,-175,252,253,-257,-256,-254,-216,-252,-233,-232,-210,-215,-213,-172,-214,354,355,-188,-176,-231,-230,-229,-228,377,-227,-240,-197,-209,-198,-196,-200,-204,-199,-195,-202,-207,-193,-192,-201,-208,-203,-205,-206,-194,386,-217,-225,-226,-173,-211,-190,-234,-235,]),}
-
-_lr_action = { }
-for _k, _v in _lr_action_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-      if not _x in _lr_action:  _lr_action[_x] = { }
-      _lr_action[_x][_k] = _y
-del _lr_action_items
-
-_lr_goto_items = {'storage_class_specifier':([0,1,14,22,42,44,48,63,76,78,89,162,164,167,245,282,319,361,],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,]),'identifier_list_opt':([63,],[132,]),'parameter_declaration':([63,78,162,164,245,319,],[135,135,135,135,342,135,]),'selection_statement':([167,282,290,363,372,395,406,408,410,423,425,428,],[291,291,291,291,291,291,291,291,291,291,291,291,]),'constant':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,]),'unary_expression':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[99,99,99,199,209,212,99,218,99,99,99,209,99,99,99,99,99,99,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,209,99,209,209,209,209,99,99,209,99,99,209,99,209,99,99,99,99,99,99,99,209,209,99,99,99,99,99,99,99,99,99,99,99,99,99,]),'conditional_expression':([62,72,77,119,151,161,167,178,192,198,205,206,208,211,235,250,259,260,274,281,282,290,302,316,361,363,364,368,372,373,379,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[130,130,130,130,130,130,130,298,130,130,130,130,130,130,130,298,298,130,130,298,130,130,298,130,130,130,130,130,130,130,130,402,130,130,130,130,130,130,130,130,130,130,130,130,130,]),'brace_close':([93,143,169,170,246,247,262,292,350,401,411,],[171,249,295,296,343,344,351,371,388,412,419,]),'struct_or_union_specifier':([0,1,14,22,42,44,48,57,63,76,78,89,91,92,93,94,96,119,162,164,167,169,170,198,208,211,245,282,319,361,],[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,]),'unified_wstring_literal':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,]),'abstract_declarator_opt':([136,217,],[240,318,]),'iteration_statement':([167,282,290,363,372,395,406,408,410,423,425,428,],[270,270,270,270,270,270,270,270,270,270,270,270,]),'init_declarator_list':([30,86,],[71,71,]),'translation_unit_or_empty':([0,],[8,]),'struct_declaration_list':([57,91,92,],[93,169,170,]),'block_item_list_opt':([167,],[292,]),'enumerator':([66,140,141,248,],[142,142,142,345,]),'pp_directive':([0,22,],[11,11,]),'abstract_declarator':([30,78,86,97,136,164,217,319,],[79,160,79,182,241,160,241,160,]),'declaration_specifiers_opt':([1,14,42,44,],[50,58,83,84,]),'external_declaration':([0,22,],[12,61,]),'type_specifier':([0,1,14,22,42,44,48,57,63,76,78,89,91,92,93,94,96,119,162,164,167,169,170,198,208,211,245,282,319,361,],[14,14,14,14,14,14,14,94,14,14,14,14,94,94,94,94,94,94,14,14,14,94,94,94,94,94,14,14,14,14,]),'designation':([154,350,384,411,],[256,256,256,256,]),'compound_statement':([88,152,167,282,290,363,372,395,406,408,410,423,425,428,],[166,255,275,275,275,275,275,275,275,275,275,275,275,275,]),'pointer':([0,4,22,30,68,78,86,97,136,147,164,217,299,319,],[16,16,16,74,146,74,163,163,74,16,163,320,16,320,]),'type_name':([119,198,208,211,],[215,304,313,314,]),'unified_string_literal':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,]),'postfix_expression':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,]),'assignment_expression_opt':([62,72,161,],[110,148,266,]),'designation_opt':([154,350,384,411,],[260,387,260,387,]),'expression_statement':([167,282,290,363,372,395,406,408,410,423,425,428,],[269,269,269,269,269,269,269,269,269,269,269,269,]),'unary_operator':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,]),'cast_expression':([62,72,77,112,119,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[111,111,111,210,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,383,111,111,111,111,111,111,111,383,111,111,111,111,111,111,111,111,111,111,111,111,111,111,]),'init_declarator':([30,86,147,],[80,80,251,]),'struct_declarator_list':([97,],[179,]),'brace_open':([7,26,54,56,64,65,77,88,151,152,167,260,282,290,317,363,372,376,380,381,387,395,406,408,410,423,425,428,],[57,66,91,92,140,141,154,167,154,167,167,154,167,167,384,167,167,384,384,384,154,167,167,167,167,167,167,167,]),'assignment_operator':([99,],[192,]),'struct_or_union':([0,1,14,22,42,44,48,57,63,76,78,89,91,92,93,94,96,119,162,164,167,169,170,198,208,211,245,282,319,361,],[7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,]),'identifier':([62,63,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,244,250,258,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[125,139,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,340,125,347,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,]),'struct_declaration':([57,91,92,93,169,170,],[95,95,95,172,172,172,]),'assignment_expression':([62,72,77,119,151,161,167,192,198,205,206,208,211,235,260,274,282,290,316,361,363,364,368,372,373,379,387,392,395,404,406,408,409,410,414,420,423,425,428,],[114,114,155,216,155,114,216,303,216,216,310,216,216,216,155,216,216,216,382,216,216,216,216,216,216,400,155,216,216,216,216,216,216,216,216,216,216,216,216,]),'parameter_type_list':([63,78,162,164,319,],[134,158,158,158,158,]),'type_qualifier_list_opt':([28,],[68,]),'direct_declarator':([0,4,16,22,30,74,78,86,97,136,147,163,164,299,],[25,25,60,25,25,60,25,25,25,25,25,60,25,25,]),'type_qualifier_list':([28,],[67,]),'designator':([154,263,350,384,411,],[257,352,257,257,257,]),'argument_expression_list':([206,],[312,]),'initializer':([77,151,260,387,],[153,254,349,403,]),'specifier_qualifier_list_opt':([94,96,],[175,177,]),'constant_expression':([178,250,259,281,302,],[297,346,348,365,375,]),'expression_opt':([167,282,290,361,363,372,392,395,404,406,408,410,414,420,423,425,428,],[272,272,272,391,272,272,405,272,413,272,272,272,421,424,272,272,272,]),'primary_expression':([62,72,77,106,112,115,119,120,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,317,361,363,364,368,372,373,379,380,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,]),'declaration_specifiers':([0,1,14,22,42,44,48,63,76,78,89,162,164,167,245,282,319,361,],[30,52,52,30,52,52,86,136,86,136,86,136,136,86,136,86,136,86,]),'declaration':([0,22,48,76,89,167,282,361,],[31,31,87,87,168,285,285,392,]),'struct_declarator_list_opt':([97,],[180,]),'identifier_list':([63,],[137,]),'typedef_name':([0,1,14,22,42,44,48,57,63,76,78,89,91,92,93,94,96,119,162,164,167,169,170,198,208,211,245,282,319,361,],[29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,]),'parameter_type_list_opt':([78,162,164,319,],[159,268,159,159,]),'jump_statement':([167,282,290,363,372,395,406,408,410,423,425,428,],[286,286,286,286,286,286,286,286,286,286,286,286,]),'declaration_list_opt':([48,76,],[88,152,]),'struct_declarator':([97,299,],[181,374,]),'function_definition':([0,22,],[36,36,]),'binary_expression':([62,72,77,119,151,161,167,178,192,198,205,206,208,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,250,259,260,274,281,282,290,302,316,361,363,364,368,372,373,379,385,387,392,395,404,406,408,409,410,414,420,423,425,428,],[126,126,126,126,126,126,126,126,126,126,126,126,126,126,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,126,338,339,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,]),'parameter_list':([63,78,162,164,319,],[138,138,138,138,138,]),'init_declarator_list_opt':([30,86,],[73,73,]),'enum_specifier':([0,1,14,22,42,44,48,57,63,76,78,89,91,92,93,94,96,119,162,164,167,169,170,198,208,211,245,282,319,361,],[45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,]),'decl_body':([0,22,48,76,89,167,282,361,],[41,41,41,41,41,41,41,41,]),'type_qualifier':([0,1,14,22,28,42,44,48,57,63,67,76,78,89,91,92,93,94,96,119,162,164,167,169,170,198,208,211,245,282,319,361,],[42,42,42,42,69,42,42,42,96,42,145,42,42,42,96,96,96,96,96,96,42,42,42,96,96,96,96,96,42,42,42,42,]),'statement':([167,282,290,363,372,395,406,408,410,423,425,428,],[284,284,370,393,398,407,415,416,418,427,429,430,]),'enumerator_list':([66,140,141,],[143,246,247,]),'labeled_statement':([167,282,290,363,372,395,406,408,410,423,425,428,],[273,273,273,273,273,273,273,273,273,273,273,273,]),'function_specifier':([0,1,14,22,42,44,48,63,76,78,89,162,164,167,245,282,319,361,],[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,]),'specifier_qualifier_list':([57,91,92,93,94,96,119,169,170,198,208,211,],[97,97,97,97,176,176,217,97,97,217,217,217,]),'block_item':([167,282,],[288,367,]),'block_item_list':([167,],[282,]),'empty':([0,1,14,28,30,42,44,48,62,63,72,76,78,86,94,96,97,136,154,161,162,164,167,217,282,290,319,350,361,363,372,384,392,395,404,406,408,410,411,414,420,423,425,428,],[47,51,51,70,75,51,51,85,129,133,129,85,157,75,174,174,183,243,261,129,157,157,289,243,366,366,157,261,366,366,366,261,366,366,366,366,366,366,261,366,366,366,366,366,]),'translation_unit':([0,],[22,]),'initializer_list':([154,384,],[262,401,]),'declarator':([0,4,22,30,78,86,97,136,147,164,299,],[48,53,48,76,53,165,184,242,165,53,184,]),'direct_abstract_declarator':([30,74,78,86,97,136,163,164,217,319,320,],[81,150,81,81,81,81,150,81,81,81,150,]),'designator_list':([154,350,384,411,],[263,263,263,263,]),'declaration_list':([48,76,],[89,89,]),'expression':([119,167,198,205,208,211,235,274,282,290,361,363,364,368,372,373,392,395,404,406,408,409,410,414,420,423,425,428,],[214,278,214,309,214,214,337,360,278,278,278,278,394,396,278,399,278,278,278,278,278,417,278,278,278,278,278,278,]),}
-
-_lr_goto = { }
-for _k, _v in _lr_goto_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-       if not _x in _lr_goto: _lr_goto[_x] = { }
-       _lr_goto[_x][_k] = _y
-del _lr_goto_items
-_lr_productions = [
-  ("S' -> translation_unit_or_empty","S'",1,None,None,None),
-  ('abstract_declarator_opt -> empty','abstract_declarator_opt',1,'p_abstract_declarator_opt','../pycparser/plyparser.py',41),
-  ('abstract_declarator_opt -> abstract_declarator','abstract_declarator_opt',1,'p_abstract_declarator_opt','../pycparser/plyparser.py',42),
-  ('assignment_expression_opt -> empty','assignment_expression_opt',1,'p_assignment_expression_opt','../pycparser/plyparser.py',41),
-  ('assignment_expression_opt -> assignment_expression','assignment_expression_opt',1,'p_assignment_expression_opt','../pycparser/plyparser.py',42),
-  ('block_item_list_opt -> empty','block_item_list_opt',1,'p_block_item_list_opt','../pycparser/plyparser.py',41),
-  ('block_item_list_opt -> block_item_list','block_item_list_opt',1,'p_block_item_list_opt','../pycparser/plyparser.py',42),
-  ('declaration_list_opt -> empty','declaration_list_opt',1,'p_declaration_list_opt','../pycparser/plyparser.py',41),
-  ('declaration_list_opt -> declaration_list','declaration_list_opt',1,'p_declaration_list_opt','../pycparser/plyparser.py',42),
-  ('declaration_specifiers_opt -> empty','declaration_specifiers_opt',1,'p_declaration_specifiers_opt','../pycparser/plyparser.py',41),
-  ('declaration_specifiers_opt -> declaration_specifiers','declaration_specifiers_opt',1,'p_declaration_specifiers_opt','../pycparser/plyparser.py',42),
-  ('designation_opt -> empty','designation_opt',1,'p_designation_opt','../pycparser/plyparser.py',41),
-  ('designation_opt -> designation','designation_opt',1,'p_designation_opt','../pycparser/plyparser.py',42),
-  ('expression_opt -> empty','expression_opt',1,'p_expression_opt','../pycparser/plyparser.py',41),
-  ('expression_opt -> expression','expression_opt',1,'p_expression_opt','../pycparser/plyparser.py',42),
-  ('identifier_list_opt -> empty','identifier_list_opt',1,'p_identifier_list_opt','../pycparser/plyparser.py',41),
-  ('identifier_list_opt -> identifier_list','identifier_list_opt',1,'p_identifier_list_opt','../pycparser/plyparser.py',42),
-  ('init_declarator_list_opt -> empty','init_declarator_list_opt',1,'p_init_declarator_list_opt','../pycparser/plyparser.py',41),
-  ('init_declarator_list_opt -> init_declarator_list','init_declarator_list_opt',1,'p_init_declarator_list_opt','../pycparser/plyparser.py',42),
-  ('parameter_type_list_opt -> empty','parameter_type_list_opt',1,'p_parameter_type_list_opt','../pycparser/plyparser.py',41),
-  ('parameter_type_list_opt -> parameter_type_list','parameter_type_list_opt',1,'p_parameter_type_list_opt','../pycparser/plyparser.py',42),
-  ('specifier_qualifier_list_opt -> empty','specifier_qualifier_list_opt',1,'p_specifier_qualifier_list_opt','../pycparser/plyparser.py',41),
-  ('specifier_qualifier_list_opt -> specifier_qualifier_list','specifier_qualifier_list_opt',1,'p_specifier_qualifier_list_opt','../pycparser/plyparser.py',42),
-  ('struct_declarator_list_opt -> empty','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','../pycparser/plyparser.py',41),
-  ('struct_declarator_list_opt -> struct_declarator_list','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','../pycparser/plyparser.py',42),
-  ('type_qualifier_list_opt -> empty','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','../pycparser/plyparser.py',41),
-  ('type_qualifier_list_opt -> type_qualifier_list','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','../pycparser/plyparser.py',42),
-  ('translation_unit_or_empty -> translation_unit','translation_unit_or_empty',1,'p_translation_unit_or_empty','../pycparser/c_parser.py',496),
-  ('translation_unit_or_empty -> empty','translation_unit_or_empty',1,'p_translation_unit_or_empty','../pycparser/c_parser.py',497),
-  ('translation_unit -> external_declaration','translation_unit',1,'p_translation_unit_1','../pycparser/c_parser.py',505),
-  ('translation_unit -> translation_unit external_declaration','translation_unit',2,'p_translation_unit_2','../pycparser/c_parser.py',512),
-  ('external_declaration -> function_definition','external_declaration',1,'p_external_declaration_1','../pycparser/c_parser.py',524),
-  ('external_declaration -> declaration','external_declaration',1,'p_external_declaration_2','../pycparser/c_parser.py',529),
-  ('external_declaration -> pp_directive','external_declaration',1,'p_external_declaration_3','../pycparser/c_parser.py',534),
-  ('external_declaration -> SEMI','external_declaration',1,'p_external_declaration_4','../pycparser/c_parser.py',539),
-  ('pp_directive -> PPHASH','pp_directive',1,'p_pp_directive','../pycparser/c_parser.py',544),
-  ('function_definition -> declarator declaration_list_opt compound_statement','function_definition',3,'p_function_definition_1','../pycparser/c_parser.py',553),
-  ('function_definition -> declaration_specifiers declarator declaration_list_opt compound_statement','function_definition',4,'p_function_definition_2','../pycparser/c_parser.py',570),
-  ('statement -> labeled_statement','statement',1,'p_statement','../pycparser/c_parser.py',581),
-  ('statement -> expression_statement','statement',1,'p_statement','../pycparser/c_parser.py',582),
-  ('statement -> compound_statement','statement',1,'p_statement','../pycparser/c_parser.py',583),
-  ('statement -> selection_statement','statement',1,'p_statement','../pycparser/c_parser.py',584),
-  ('statement -> iteration_statement','statement',1,'p_statement','../pycparser/c_parser.py',585),
-  ('statement -> jump_statement','statement',1,'p_statement','../pycparser/c_parser.py',586),
-  ('decl_body -> declaration_specifiers init_declarator_list_opt','decl_body',2,'p_decl_body','../pycparser/c_parser.py',600),
-  ('declaration -> decl_body SEMI','declaration',2,'p_declaration','../pycparser/c_parser.py',659),
-  ('declaration_list -> declaration','declaration_list',1,'p_declaration_list','../pycparser/c_parser.py',668),
-  ('declaration_list -> declaration_list declaration','declaration_list',2,'p_declaration_list','../pycparser/c_parser.py',669),
-  ('declaration_specifiers -> type_qualifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_1','../pycparser/c_parser.py',674),
-  ('declaration_specifiers -> type_specifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_2','../pycparser/c_parser.py',679),
-  ('declaration_specifiers -> storage_class_specifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_3','../pycparser/c_parser.py',684),
-  ('declaration_specifiers -> function_specifier declaration_specifiers_opt','declaration_specifiers',2,'p_declaration_specifiers_4','../pycparser/c_parser.py',689),
-  ('storage_class_specifier -> AUTO','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',694),
-  ('storage_class_specifier -> REGISTER','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',695),
-  ('storage_class_specifier -> STATIC','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',696),
-  ('storage_class_specifier -> EXTERN','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',697),
-  ('storage_class_specifier -> TYPEDEF','storage_class_specifier',1,'p_storage_class_specifier','../pycparser/c_parser.py',698),
-  ('function_specifier -> INLINE','function_specifier',1,'p_function_specifier','../pycparser/c_parser.py',703),
-  ('type_specifier -> VOID','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',708),
-  ('type_specifier -> _BOOL','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',709),
-  ('type_specifier -> CHAR','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',710),
-  ('type_specifier -> SHORT','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',711),
-  ('type_specifier -> INT','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',712),
-  ('type_specifier -> LONG','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',713),
-  ('type_specifier -> FLOAT','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',714),
-  ('type_specifier -> DOUBLE','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',715),
-  ('type_specifier -> _COMPLEX','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',716),
-  ('type_specifier -> SIGNED','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',717),
-  ('type_specifier -> UNSIGNED','type_specifier',1,'p_type_specifier_1','../pycparser/c_parser.py',718),
-  ('type_specifier -> typedef_name','type_specifier',1,'p_type_specifier_2','../pycparser/c_parser.py',723),
-  ('type_specifier -> enum_specifier','type_specifier',1,'p_type_specifier_2','../pycparser/c_parser.py',724),
-  ('type_specifier -> struct_or_union_specifier','type_specifier',1,'p_type_specifier_2','../pycparser/c_parser.py',725),
-  ('type_qualifier -> CONST','type_qualifier',1,'p_type_qualifier','../pycparser/c_parser.py',730),
-  ('type_qualifier -> RESTRICT','type_qualifier',1,'p_type_qualifier','../pycparser/c_parser.py',731),
-  ('type_qualifier -> VOLATILE','type_qualifier',1,'p_type_qualifier','../pycparser/c_parser.py',732),
-  ('init_declarator_list -> init_declarator','init_declarator_list',1,'p_init_declarator_list_1','../pycparser/c_parser.py',737),
-  ('init_declarator_list -> init_declarator_list COMMA init_declarator','init_declarator_list',3,'p_init_declarator_list_1','../pycparser/c_parser.py',738),
-  ('init_declarator_list -> EQUALS initializer','init_declarator_list',2,'p_init_declarator_list_2','../pycparser/c_parser.py',748),
-  ('init_declarator_list -> abstract_declarator','init_declarator_list',1,'p_init_declarator_list_3','../pycparser/c_parser.py',756),
-  ('init_declarator -> declarator','init_declarator',1,'p_init_declarator','../pycparser/c_parser.py',764),
-  ('init_declarator -> declarator EQUALS initializer','init_declarator',3,'p_init_declarator','../pycparser/c_parser.py',765),
-  ('specifier_qualifier_list -> type_qualifier specifier_qualifier_list_opt','specifier_qualifier_list',2,'p_specifier_qualifier_list_1','../pycparser/c_parser.py',770),
-  ('specifier_qualifier_list -> type_specifier specifier_qualifier_list_opt','specifier_qualifier_list',2,'p_specifier_qualifier_list_2','../pycparser/c_parser.py',775),
-  ('struct_or_union_specifier -> struct_or_union ID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','../pycparser/c_parser.py',783),
-  ('struct_or_union_specifier -> struct_or_union TYPEID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','../pycparser/c_parser.py',784),
-  ('struct_or_union_specifier -> struct_or_union brace_open struct_declaration_list brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_2','../pycparser/c_parser.py',793),
-  ('struct_or_union_specifier -> struct_or_union ID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','../pycparser/c_parser.py',802),
-  ('struct_or_union_specifier -> struct_or_union TYPEID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','../pycparser/c_parser.py',803),
-  ('struct_or_union -> STRUCT','struct_or_union',1,'p_struct_or_union','../pycparser/c_parser.py',812),
-  ('struct_or_union -> UNION','struct_or_union',1,'p_struct_or_union','../pycparser/c_parser.py',813),
-  ('struct_declaration_list -> struct_declaration','struct_declaration_list',1,'p_struct_declaration_list','../pycparser/c_parser.py',820),
-  ('struct_declaration_list -> struct_declaration_list struct_declaration','struct_declaration_list',2,'p_struct_declaration_list','../pycparser/c_parser.py',821),
-  ('struct_declaration -> specifier_qualifier_list struct_declarator_list_opt SEMI','struct_declaration',3,'p_struct_declaration_1','../pycparser/c_parser.py',826),
-  ('struct_declaration -> specifier_qualifier_list abstract_declarator SEMI','struct_declaration',3,'p_struct_declaration_2','../pycparser/c_parser.py',864),
-  ('struct_declarator_list -> struct_declarator','struct_declarator_list',1,'p_struct_declarator_list','../pycparser/c_parser.py',878),
-  ('struct_declarator_list -> struct_declarator_list COMMA struct_declarator','struct_declarator_list',3,'p_struct_declarator_list','../pycparser/c_parser.py',879),
-  ('struct_declarator -> declarator','struct_declarator',1,'p_struct_declarator_1','../pycparser/c_parser.py',887),
-  ('struct_declarator -> declarator COLON constant_expression','struct_declarator',3,'p_struct_declarator_2','../pycparser/c_parser.py',892),
-  ('struct_declarator -> COLON constant_expression','struct_declarator',2,'p_struct_declarator_2','../pycparser/c_parser.py',893),
-  ('enum_specifier -> ENUM ID','enum_specifier',2,'p_enum_specifier_1','../pycparser/c_parser.py',901),
-  ('enum_specifier -> ENUM TYPEID','enum_specifier',2,'p_enum_specifier_1','../pycparser/c_parser.py',902),
-  ('enum_specifier -> ENUM brace_open enumerator_list brace_close','enum_specifier',4,'p_enum_specifier_2','../pycparser/c_parser.py',907),
-  ('enum_specifier -> ENUM ID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','../pycparser/c_parser.py',912),
-  ('enum_specifier -> ENUM TYPEID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','../pycparser/c_parser.py',913),
-  ('enumerator_list -> enumerator','enumerator_list',1,'p_enumerator_list','../pycparser/c_parser.py',918),
-  ('enumerator_list -> enumerator_list COMMA','enumerator_list',2,'p_enumerator_list','../pycparser/c_parser.py',919),
-  ('enumerator_list -> enumerator_list COMMA enumerator','enumerator_list',3,'p_enumerator_list','../pycparser/c_parser.py',920),
-  ('enumerator -> ID','enumerator',1,'p_enumerator','../pycparser/c_parser.py',931),
-  ('enumerator -> ID EQUALS constant_expression','enumerator',3,'p_enumerator','../pycparser/c_parser.py',932),
-  ('declarator -> direct_declarator','declarator',1,'p_declarator_1','../pycparser/c_parser.py',947),
-  ('declarator -> pointer direct_declarator','declarator',2,'p_declarator_2','../pycparser/c_parser.py',952),
-  ('declarator -> pointer TYPEID','declarator',2,'p_declarator_3','../pycparser/c_parser.py',961),
-  ('direct_declarator -> ID','direct_declarator',1,'p_direct_declarator_1','../pycparser/c_parser.py',972),
-  ('direct_declarator -> LPAREN declarator RPAREN','direct_declarator',3,'p_direct_declarator_2','../pycparser/c_parser.py',981),
-  ('direct_declarator -> direct_declarator LBRACKET assignment_expression_opt RBRACKET','direct_declarator',4,'p_direct_declarator_3','../pycparser/c_parser.py',986),
-  ('direct_declarator -> direct_declarator LBRACKET TIMES RBRACKET','direct_declarator',4,'p_direct_declarator_4','../pycparser/c_parser.py',998),
-  ('direct_declarator -> direct_declarator LPAREN parameter_type_list RPAREN','direct_declarator',4,'p_direct_declarator_5','../pycparser/c_parser.py',1008),
-  ('direct_declarator -> direct_declarator LPAREN identifier_list_opt RPAREN','direct_declarator',4,'p_direct_declarator_5','../pycparser/c_parser.py',1009),
-  ('pointer -> TIMES type_qualifier_list_opt','pointer',2,'p_pointer','../pycparser/c_parser.py',1036),
-  ('pointer -> TIMES type_qualifier_list_opt pointer','pointer',3,'p_pointer','../pycparser/c_parser.py',1037),
-  ('type_qualifier_list -> type_qualifier','type_qualifier_list',1,'p_type_qualifier_list','../pycparser/c_parser.py',1047),
-  ('type_qualifier_list -> type_qualifier_list type_qualifier','type_qualifier_list',2,'p_type_qualifier_list','../pycparser/c_parser.py',1048),
-  ('parameter_type_list -> parameter_list','parameter_type_list',1,'p_parameter_type_list','../pycparser/c_parser.py',1053),
-  ('parameter_type_list -> parameter_list COMMA ELLIPSIS','parameter_type_list',3,'p_parameter_type_list','../pycparser/c_parser.py',1054),
-  ('parameter_list -> parameter_declaration','parameter_list',1,'p_parameter_list','../pycparser/c_parser.py',1062),
-  ('parameter_list -> parameter_list COMMA parameter_declaration','parameter_list',3,'p_parameter_list','../pycparser/c_parser.py',1063),
-  ('parameter_declaration -> declaration_specifiers declarator','parameter_declaration',2,'p_parameter_declaration_1','../pycparser/c_parser.py',1072),
-  ('parameter_declaration -> declaration_specifiers abstract_declarator_opt','parameter_declaration',2,'p_parameter_declaration_2','../pycparser/c_parser.py',1083),
-  ('identifier_list -> identifier','identifier_list',1,'p_identifier_list','../pycparser/c_parser.py',1113),
-  ('identifier_list -> identifier_list COMMA identifier','identifier_list',3,'p_identifier_list','../pycparser/c_parser.py',1114),
-  ('initializer -> assignment_expression','initializer',1,'p_initializer_1','../pycparser/c_parser.py',1123),
-  ('initializer -> brace_open initializer_list brace_close','initializer',3,'p_initializer_2','../pycparser/c_parser.py',1128),
-  ('initializer -> brace_open initializer_list COMMA brace_close','initializer',4,'p_initializer_2','../pycparser/c_parser.py',1129),
-  ('initializer_list -> designation_opt initializer','initializer_list',2,'p_initializer_list','../pycparser/c_parser.py',1134),
-  ('initializer_list -> initializer_list COMMA designation_opt initializer','initializer_list',4,'p_initializer_list','../pycparser/c_parser.py',1135),
-  ('designation -> designator_list EQUALS','designation',2,'p_designation','../pycparser/c_parser.py',1146),
-  ('designator_list -> designator','designator_list',1,'p_designator_list','../pycparser/c_parser.py',1154),
-  ('designator_list -> designator_list designator','designator_list',2,'p_designator_list','../pycparser/c_parser.py',1155),
-  ('designator -> LBRACKET constant_expression RBRACKET','designator',3,'p_designator','../pycparser/c_parser.py',1160),
-  ('designator -> PERIOD identifier','designator',2,'p_designator','../pycparser/c_parser.py',1161),
-  ('type_name -> specifier_qualifier_list abstract_declarator_opt','type_name',2,'p_type_name','../pycparser/c_parser.py',1166),
-  ('abstract_declarator -> pointer','abstract_declarator',1,'p_abstract_declarator_1','../pycparser/c_parser.py',1182),
-  ('abstract_declarator -> pointer direct_abstract_declarator','abstract_declarator',2,'p_abstract_declarator_2','../pycparser/c_parser.py',1190),
-  ('abstract_declarator -> direct_abstract_declarator','abstract_declarator',1,'p_abstract_declarator_3','../pycparser/c_parser.py',1195),
-  ('direct_abstract_declarator -> LPAREN abstract_declarator RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_1','../pycparser/c_parser.py',1205),
-  ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_2','../pycparser/c_parser.py',1209),
-  ('direct_abstract_declarator -> LBRACKET assignment_expression_opt RBRACKET','direct_abstract_declarator',3,'p_direct_abstract_declarator_3','../pycparser/c_parser.py',1219),
-  ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET TIMES RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_4','../pycparser/c_parser.py',1227),
-  ('direct_abstract_declarator -> LBRACKET TIMES RBRACKET','direct_abstract_declarator',3,'p_direct_abstract_declarator_5','../pycparser/c_parser.py',1237),
-  ('direct_abstract_declarator -> direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',4,'p_direct_abstract_declarator_6','../pycparser/c_parser.py',1245),
-  ('direct_abstract_declarator -> LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_7','../pycparser/c_parser.py',1255),
-  ('block_item -> declaration','block_item',1,'p_block_item','../pycparser/c_parser.py',1266),
-  ('block_item -> statement','block_item',1,'p_block_item','../pycparser/c_parser.py',1267),
-  ('block_item_list -> block_item','block_item_list',1,'p_block_item_list','../pycparser/c_parser.py',1274),
-  ('block_item_list -> block_item_list block_item','block_item_list',2,'p_block_item_list','../pycparser/c_parser.py',1275),
-  ('compound_statement -> brace_open block_item_list_opt brace_close','compound_statement',3,'p_compound_statement_1','../pycparser/c_parser.py',1281),
-  ('labeled_statement -> ID COLON statement','labeled_statement',3,'p_labeled_statement_1','../pycparser/c_parser.py',1287),
-  ('labeled_statement -> CASE constant_expression COLON statement','labeled_statement',4,'p_labeled_statement_2','../pycparser/c_parser.py',1291),
-  ('labeled_statement -> DEFAULT COLON statement','labeled_statement',3,'p_labeled_statement_3','../pycparser/c_parser.py',1295),
-  ('selection_statement -> IF LPAREN expression RPAREN statement','selection_statement',5,'p_selection_statement_1','../pycparser/c_parser.py',1299),
-  ('selection_statement -> IF LPAREN expression RPAREN statement ELSE statement','selection_statement',7,'p_selection_statement_2','../pycparser/c_parser.py',1303),
-  ('selection_statement -> SWITCH LPAREN expression RPAREN statement','selection_statement',5,'p_selection_statement_3','../pycparser/c_parser.py',1307),
-  ('iteration_statement -> WHILE LPAREN expression RPAREN statement','iteration_statement',5,'p_iteration_statement_1','../pycparser/c_parser.py',1312),
-  ('iteration_statement -> DO statement WHILE LPAREN expression RPAREN SEMI','iteration_statement',7,'p_iteration_statement_2','../pycparser/c_parser.py',1316),
-  ('iteration_statement -> FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement','iteration_statement',9,'p_iteration_statement_3','../pycparser/c_parser.py',1320),
-  ('iteration_statement -> FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement','iteration_statement',8,'p_iteration_statement_4','../pycparser/c_parser.py',1324),
-  ('jump_statement -> GOTO ID SEMI','jump_statement',3,'p_jump_statement_1','../pycparser/c_parser.py',1328),
-  ('jump_statement -> BREAK SEMI','jump_statement',2,'p_jump_statement_2','../pycparser/c_parser.py',1332),
-  ('jump_statement -> CONTINUE SEMI','jump_statement',2,'p_jump_statement_3','../pycparser/c_parser.py',1336),
-  ('jump_statement -> RETURN expression SEMI','jump_statement',3,'p_jump_statement_4','../pycparser/c_parser.py',1340),
-  ('jump_statement -> RETURN SEMI','jump_statement',2,'p_jump_statement_4','../pycparser/c_parser.py',1341),
-  ('expression_statement -> expression_opt SEMI','expression_statement',2,'p_expression_statement','../pycparser/c_parser.py',1346),
-  ('expression -> assignment_expression','expression',1,'p_expression','../pycparser/c_parser.py',1353),
-  ('expression -> expression COMMA assignment_expression','expression',3,'p_expression','../pycparser/c_parser.py',1354),
-  ('typedef_name -> TYPEID','typedef_name',1,'p_typedef_name','../pycparser/c_parser.py',1366),
-  ('assignment_expression -> conditional_expression','assignment_expression',1,'p_assignment_expression','../pycparser/c_parser.py',1370),
-  ('assignment_expression -> unary_expression assignment_operator assignment_expression','assignment_expression',3,'p_assignment_expression','../pycparser/c_parser.py',1371),
-  ('assignment_operator -> EQUALS','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1384),
-  ('assignment_operator -> XOREQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1385),
-  ('assignment_operator -> TIMESEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1386),
-  ('assignment_operator -> DIVEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1387),
-  ('assignment_operator -> MODEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1388),
-  ('assignment_operator -> PLUSEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1389),
-  ('assignment_operator -> MINUSEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1390),
-  ('assignment_operator -> LSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1391),
-  ('assignment_operator -> RSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1392),
-  ('assignment_operator -> ANDEQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1393),
-  ('assignment_operator -> OREQUAL','assignment_operator',1,'p_assignment_operator','../pycparser/c_parser.py',1394),
-  ('constant_expression -> conditional_expression','constant_expression',1,'p_constant_expression','../pycparser/c_parser.py',1399),
-  ('conditional_expression -> binary_expression','conditional_expression',1,'p_conditional_expression','../pycparser/c_parser.py',1403),
-  ('conditional_expression -> binary_expression CONDOP expression COLON conditional_expression','conditional_expression',5,'p_conditional_expression','../pycparser/c_parser.py',1404),
-  ('binary_expression -> cast_expression','binary_expression',1,'p_binary_expression','../pycparser/c_parser.py',1412),
-  ('binary_expression -> binary_expression TIMES binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1413),
-  ('binary_expression -> binary_expression DIVIDE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1414),
-  ('binary_expression -> binary_expression MOD binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1415),
-  ('binary_expression -> binary_expression PLUS binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1416),
-  ('binary_expression -> binary_expression MINUS binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1417),
-  ('binary_expression -> binary_expression RSHIFT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1418),
-  ('binary_expression -> binary_expression LSHIFT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1419),
-  ('binary_expression -> binary_expression LT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1420),
-  ('binary_expression -> binary_expression LE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1421),
-  ('binary_expression -> binary_expression GE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1422),
-  ('binary_expression -> binary_expression GT binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1423),
-  ('binary_expression -> binary_expression EQ binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1424),
-  ('binary_expression -> binary_expression NE binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1425),
-  ('binary_expression -> binary_expression AND binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1426),
-  ('binary_expression -> binary_expression OR binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1427),
-  ('binary_expression -> binary_expression XOR binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1428),
-  ('binary_expression -> binary_expression LAND binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1429),
-  ('binary_expression -> binary_expression LOR binary_expression','binary_expression',3,'p_binary_expression','../pycparser/c_parser.py',1430),
-  ('cast_expression -> unary_expression','cast_expression',1,'p_cast_expression_1','../pycparser/c_parser.py',1438),
-  ('cast_expression -> LPAREN type_name RPAREN cast_expression','cast_expression',4,'p_cast_expression_2','../pycparser/c_parser.py',1442),
-  ('unary_expression -> postfix_expression','unary_expression',1,'p_unary_expression_1','../pycparser/c_parser.py',1446),
-  ('unary_expression -> PLUSPLUS unary_expression','unary_expression',2,'p_unary_expression_2','../pycparser/c_parser.py',1450),
-  ('unary_expression -> MINUSMINUS unary_expression','unary_expression',2,'p_unary_expression_2','../pycparser/c_parser.py',1451),
-  ('unary_expression -> unary_operator cast_expression','unary_expression',2,'p_unary_expression_2','../pycparser/c_parser.py',1452),
-  ('unary_expression -> SIZEOF unary_expression','unary_expression',2,'p_unary_expression_3','../pycparser/c_parser.py',1457),
-  ('unary_expression -> SIZEOF LPAREN type_name RPAREN','unary_expression',4,'p_unary_expression_3','../pycparser/c_parser.py',1458),
-  ('unary_operator -> AND','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1466),
-  ('unary_operator -> TIMES','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1467),
-  ('unary_operator -> PLUS','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1468),
-  ('unary_operator -> MINUS','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1469),
-  ('unary_operator -> NOT','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1470),
-  ('unary_operator -> LNOT','unary_operator',1,'p_unary_operator','../pycparser/c_parser.py',1471),
-  ('postfix_expression -> primary_expression','postfix_expression',1,'p_postfix_expression_1','../pycparser/c_parser.py',1476),
-  ('postfix_expression -> postfix_expression LBRACKET expression RBRACKET','postfix_expression',4,'p_postfix_expression_2','../pycparser/c_parser.py',1480),
-  ('postfix_expression -> postfix_expression LPAREN argument_expression_list RPAREN','postfix_expression',4,'p_postfix_expression_3','../pycparser/c_parser.py',1484),
-  ('postfix_expression -> postfix_expression LPAREN RPAREN','postfix_expression',3,'p_postfix_expression_3','../pycparser/c_parser.py',1485),
-  ('postfix_expression -> postfix_expression PERIOD ID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1490),
-  ('postfix_expression -> postfix_expression PERIOD TYPEID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1491),
-  ('postfix_expression -> postfix_expression ARROW ID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1492),
-  ('postfix_expression -> postfix_expression ARROW TYPEID','postfix_expression',3,'p_postfix_expression_4','../pycparser/c_parser.py',1493),
-  ('postfix_expression -> postfix_expression PLUSPLUS','postfix_expression',2,'p_postfix_expression_5','../pycparser/c_parser.py',1499),
-  ('postfix_expression -> postfix_expression MINUSMINUS','postfix_expression',2,'p_postfix_expression_5','../pycparser/c_parser.py',1500),
-  ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list brace_close','postfix_expression',6,'p_postfix_expression_6','../pycparser/c_parser.py',1505),
-  ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close','postfix_expression',7,'p_postfix_expression_6','../pycparser/c_parser.py',1506),
-  ('primary_expression -> identifier','primary_expression',1,'p_primary_expression_1','../pycparser/c_parser.py',1511),
-  ('primary_expression -> constant','primary_expression',1,'p_primary_expression_2','../pycparser/c_parser.py',1515),
-  ('primary_expression -> unified_string_literal','primary_expression',1,'p_primary_expression_3','../pycparser/c_parser.py',1519),
-  ('primary_expression -> unified_wstring_literal','primary_expression',1,'p_primary_expression_3','../pycparser/c_parser.py',1520),
-  ('primary_expression -> LPAREN expression RPAREN','primary_expression',3,'p_primary_expression_4','../pycparser/c_parser.py',1525),
-  ('argument_expression_list -> assignment_expression','argument_expression_list',1,'p_argument_expression_list','../pycparser/c_parser.py',1529),
-  ('argument_expression_list -> argument_expression_list COMMA assignment_expression','argument_expression_list',3,'p_argument_expression_list','../pycparser/c_parser.py',1530),
-  ('identifier -> ID','identifier',1,'p_identifier','../pycparser/c_parser.py',1539),
-  ('constant -> INT_CONST_DEC','constant',1,'p_constant_1','../pycparser/c_parser.py',1543),
-  ('constant -> INT_CONST_OCT','constant',1,'p_constant_1','../pycparser/c_parser.py',1544),
-  ('constant -> INT_CONST_HEX','constant',1,'p_constant_1','../pycparser/c_parser.py',1545),
-  ('constant -> FLOAT_CONST','constant',1,'p_constant_2','../pycparser/c_parser.py',1551),
-  ('constant -> HEX_FLOAT_CONST','constant',1,'p_constant_2','../pycparser/c_parser.py',1552),
-  ('constant -> CHAR_CONST','constant',1,'p_constant_3','../pycparser/c_parser.py',1558),
-  ('constant -> WCHAR_CONST','constant',1,'p_constant_3','../pycparser/c_parser.py',1559),
-  ('unified_string_literal -> STRING_LITERAL','unified_string_literal',1,'p_unified_string_literal','../pycparser/c_parser.py',1570),
-  ('unified_string_literal -> unified_string_literal STRING_LITERAL','unified_string_literal',2,'p_unified_string_literal','../pycparser/c_parser.py',1571),
-  ('unified_wstring_literal -> WSTRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','../pycparser/c_parser.py',1581),
-  ('unified_wstring_literal -> unified_wstring_literal WSTRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','../pycparser/c_parser.py',1582),
-  ('brace_open -> LBRACE','brace_open',1,'p_brace_open','../pycparser/c_parser.py',1592),
-  ('brace_close -> RBRACE','brace_close',1,'p_brace_close','../pycparser/c_parser.py',1597),
-  ('empty -> ','empty',0,'p_empty','../pycparser/c_parser.py',1602),
-]
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/DESCRIPTION.rst b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/DESCRIPTION.rst
new file mode 100644
index 0000000..c6b6a1c
--- /dev/null
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/DESCRIPTION.rst
@@ -0,0 +1,238 @@
+===============================
+Installing and Using Setuptools
+===============================
+
+.. contents:: **Table of Contents**
+
+
+`Change History `_.
+
+-------------------------
+Installation Instructions
+-------------------------
+
+The recommended way to bootstrap setuptools on any system is to download
+`ez_setup.py`_ and run it using the target Python environment. Different
+operating systems have different recommended techniques to accomplish this
+basic routine, so below are some examples to get you started.
+
+Setuptools requires Python 2.6 or later. To install setuptools
+on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
+`_.
+
+The link provided to ez_setup.py is a bookmark to bootstrap script for the
+latest known stable release.
+
+.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
+
+Windows (Powershell 3 or later)
+===============================
+
+For best results, uninstall previous versions FIRST (see `Uninstalling`_).
+
+Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
+with PowerShell 3 installed, it's possible to install with one simple
+Powershell command. Start up Powershell and paste this command::
+
+    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
+
+You must start the Powershell with Administrative privileges or you may choose
+to install a user-local installation::
+
+    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
+
+If you have Python 3.3 or later, you can use the ``py`` command to install to
+different Python versions. For example, to install to Python 3.3 if you have
+Python 2.7 installed::
+
+    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
+
+The recommended way to install setuptools on Windows is to download
+`ez_setup.py`_ and run it. The script will download the appropriate
+distribution file and install it for you.
+
+Once installation is complete, you will find an ``easy_install`` program in
+your Python ``Scripts`` subdirectory.  For simple invocation and best results,
+add this directory to your ``PATH`` environment variable, if it is not already
+present. If you did a user-local install, the ``Scripts`` subdirectory is
+``$env:APPDATA\Python\Scripts``.
+
+
+Windows (simplified)
+====================
+
+For Windows without PowerShell 3 or for installation without a command-line,
+download `ez_setup.py`_ using your preferred web browser or other technique
+and "run" that file.
+
+
+Unix (wget)
+===========
+
+Most Linux distributions come with wget.
+
+Download `ez_setup.py`_ and run it using the target Python version. The script
+will download the appropriate version and install it for you::
+
+    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python
+
+Note that you will may need to invoke the command with superuser privileges to
+install to the system Python::
+
+    > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
+
+Alternatively, Setuptools may be installed to a user-local path::
+
+    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
+
+Note that on some older systems (noted on Debian 6 and CentOS 5 installations),
+`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net`
+does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using
+`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the
+host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget`
+(see `Issue 59 `_). If you happen to encounter them,
+install Setuptools as follows::
+
+    > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
+    > python ez_setup.py --insecure
+
+
+Unix including Mac OS X (curl)
+==============================
+
+If your system has curl installed, follow the ``wget`` instructions but
+replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
+
+    > curl https://bootstrap.pypa.io/ez_setup.py -o - | python
+
+
+Advanced Installation
+=====================
+
+For more advanced installation options, such as installing to custom
+locations or prefixes, download and extract the source
+tarball from `Setuptools on PyPI `_
+and run setup.py with any supported distutils and Setuptools options.
+For example::
+
+    setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
+
+Use ``--help`` to get a full options list, but we recommend consulting
+the `EasyInstall manual`_ for detailed instructions, especially `the section
+on custom installation locations`_.
+
+.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
+.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
+
+
+Downloads
+=========
+
+All setuptools downloads can be found at `the project's home page in the Python
+Package Index`_.  Scroll to the very bottom of the page to find the links.
+
+.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
+
+In addition to the PyPI downloads, the development version of ``setuptools``
+is available from the `Bitbucket repo`_, and in-development versions of the
+`0.6 branch`_ are available as well.
+
+.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
+.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
+
+Uninstalling
+============
+
+On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
+installer, simply use the uninstall feature of "Add/Remove Programs" in the
+Control Panel.
+
+Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
+version, delete all ``setuptools*`` and ``distribute*`` files and
+directories from your system's ``site-packages`` directory
+(and any other ``sys.path`` directories) FIRST.
+
+If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
+nothing further needs to be done. If you want to completely remove Setuptools,
+you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
+and associated executables installed to the Python scripts directory.
+
+--------------------------------
+Using Setuptools and EasyInstall
+--------------------------------
+
+Here are some of the available manuals, tutorials, and other resources for
+learning about Setuptools, Python Eggs, and EasyInstall:
+
+* `The EasyInstall user's guide and reference manual`_
+* `The setuptools Developer's Guide`_
+* `The pkg_resources API reference`_
+* `The Internal Structure of Python Eggs`_
+
+Questions, comments, and bug reports should be directed to the `distutils-sig
+mailing list`_.  If you have written (or know of) any tutorials, documentation,
+plug-ins, or other resources for setuptools users, please let us know about
+them there, so this reference list can be updated.  If you have working,
+*tested* patches to correct problems or add features, you may submit them to
+the `setuptools bug tracker`_.
+
+.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
+.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
+.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
+.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
+.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
+.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
+
+
+-------
+Credits
+-------
+
+* The original design for the ``.egg`` format and the ``pkg_resources`` API was
+  co-created by Phillip Eby and Bob Ippolito.  Bob also implemented the first
+  version of ``pkg_resources``, and supplied the OS X operating system version
+  compatibility algorithm.
+
+* Ian Bicking implemented many early "creature comfort" features of
+  easy_install, including support for downloading via Sourceforge and
+  Subversion repositories.  Ian's comments on the Web-SIG about WSGI
+  application deployment also inspired the concept of "entry points" in eggs,
+  and he has given talks at PyCon and elsewhere to inform and educate the
+  community about eggs and setuptools.
+
+* Jim Fulton contributed time and effort to build automated tests of various
+  aspects of ``easy_install``, and supplied the doctests for the command-line
+  ``.exe`` wrappers on Windows.
+
+* Phillip J. Eby is the seminal author of setuptools, and
+  first proposed the idea of an importable binary distribution format for
+  Python application plug-ins.
+
+* Significant parts of the implementation of setuptools were funded by the Open
+  Source Applications Foundation, to provide a plug-in infrastructure for the
+  Chandler PIM application.  In addition, many OSAF staffers (such as Mike
+  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
+  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)
+
+* Tarek Ziadé is the principal author of the Distribute fork, which
+  re-invigorated the community on the project, encouraged renewed innovation,
+  and addressed many defects.
+
+* Since the merge with Distribute, Jason R. Coombs is the
+  maintainer of setuptools.  The project is maintained in coordination with
+  the Python Packaging Authority (PyPA) and the larger Python community.
+
+.. _files:
+
+
+---------------
+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`_.
+
+.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
+
+
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/METADATA b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/METADATA
new file mode 100644
index 0000000..cc275ba
--- /dev/null
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/METADATA
@@ -0,0 +1,268 @@
+Metadata-Version: 2.0
+Name: setuptools
+Version: 18.6.1
+Summary: Easily download, build, install, upgrade, and uninstall Python packages
+Home-page: https://bitbucket.org/pypa/setuptools
+Author: Python Packaging Authority
+Author-email: distutils-sig@python.org
+License: PSF or ZPL
+Keywords: CPAN PyPI distutils eggs package management
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: License :: OSI Approved :: Zope Public License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: System :: Archiving :: Packaging
+Classifier: Topic :: System :: Systems Administration
+Classifier: Topic :: Utilities
+Provides-Extra: certs
+Requires-Dist: certifi (==2015.04.28); extra == 'certs'
+Provides-Extra: ssl
+Requires-Dist: wincertstore (==0.2); sys_platform=='win32' and extra == 'ssl'
+
+===============================
+Installing and Using Setuptools
+===============================
+
+.. contents:: **Table of Contents**
+
+
+`Change History `_.
+
+-------------------------
+Installation Instructions
+-------------------------
+
+The recommended way to bootstrap setuptools on any system is to download
+`ez_setup.py`_ and run it using the target Python environment. Different
+operating systems have different recommended techniques to accomplish this
+basic routine, so below are some examples to get you started.
+
+Setuptools requires Python 2.6 or later. To install setuptools
+on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
+`_.
+
+The link provided to ez_setup.py is a bookmark to bootstrap script for the
+latest known stable release.
+
+.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
+
+Windows (Powershell 3 or later)
+===============================
+
+For best results, uninstall previous versions FIRST (see `Uninstalling`_).
+
+Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
+with PowerShell 3 installed, it's possible to install with one simple
+Powershell command. Start up Powershell and paste this command::
+
+    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
+
+You must start the Powershell with Administrative privileges or you may choose
+to install a user-local installation::
+
+    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
+
+If you have Python 3.3 or later, you can use the ``py`` command to install to
+different Python versions. For example, to install to Python 3.3 if you have
+Python 2.7 installed::
+
+    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
+
+The recommended way to install setuptools on Windows is to download
+`ez_setup.py`_ and run it. The script will download the appropriate
+distribution file and install it for you.
+
+Once installation is complete, you will find an ``easy_install`` program in
+your Python ``Scripts`` subdirectory.  For simple invocation and best results,
+add this directory to your ``PATH`` environment variable, if it is not already
+present. If you did a user-local install, the ``Scripts`` subdirectory is
+``$env:APPDATA\Python\Scripts``.
+
+
+Windows (simplified)
+====================
+
+For Windows without PowerShell 3 or for installation without a command-line,
+download `ez_setup.py`_ using your preferred web browser or other technique
+and "run" that file.
+
+
+Unix (wget)
+===========
+
+Most Linux distributions come with wget.
+
+Download `ez_setup.py`_ and run it using the target Python version. The script
+will download the appropriate version and install it for you::
+
+    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python
+
+Note that you will may need to invoke the command with superuser privileges to
+install to the system Python::
+
+    > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
+
+Alternatively, Setuptools may be installed to a user-local path::
+
+    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
+
+Note that on some older systems (noted on Debian 6 and CentOS 5 installations),
+`wget` may refuse to download `ez_setup.py`, complaining that the certificate common name `*.c.ssl.fastly.net`
+does not match the host name `bootstrap.pypa.io`. In addition, the `ez_setup.py` script may then encounter similar problems using
+`wget` internally to download `setuptools-x.y.zip`, complaining that the certificate common name of `www.python.org` does not match the
+host name `pypi.python.org`. Those are known issues, related to a bug in the older versions of `wget`
+(see `Issue 59 `_). If you happen to encounter them,
+install Setuptools as follows::
+
+    > wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py
+    > python ez_setup.py --insecure
+
+
+Unix including Mac OS X (curl)
+==============================
+
+If your system has curl installed, follow the ``wget`` instructions but
+replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
+
+    > curl https://bootstrap.pypa.io/ez_setup.py -o - | python
+
+
+Advanced Installation
+=====================
+
+For more advanced installation options, such as installing to custom
+locations or prefixes, download and extract the source
+tarball from `Setuptools on PyPI `_
+and run setup.py with any supported distutils and Setuptools options.
+For example::
+
+    setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
+
+Use ``--help`` to get a full options list, but we recommend consulting
+the `EasyInstall manual`_ for detailed instructions, especially `the section
+on custom installation locations`_.
+
+.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
+.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
+
+
+Downloads
+=========
+
+All setuptools downloads can be found at `the project's home page in the Python
+Package Index`_.  Scroll to the very bottom of the page to find the links.
+
+.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
+
+In addition to the PyPI downloads, the development version of ``setuptools``
+is available from the `Bitbucket repo`_, and in-development versions of the
+`0.6 branch`_ are available as well.
+
+.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
+.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
+
+Uninstalling
+============
+
+On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
+installer, simply use the uninstall feature of "Add/Remove Programs" in the
+Control Panel.
+
+Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
+version, delete all ``setuptools*`` and ``distribute*`` files and
+directories from your system's ``site-packages`` directory
+(and any other ``sys.path`` directories) FIRST.
+
+If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
+nothing further needs to be done. If you want to completely remove Setuptools,
+you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
+and associated executables installed to the Python scripts directory.
+
+--------------------------------
+Using Setuptools and EasyInstall
+--------------------------------
+
+Here are some of the available manuals, tutorials, and other resources for
+learning about Setuptools, Python Eggs, and EasyInstall:
+
+* `The EasyInstall user's guide and reference manual`_
+* `The setuptools Developer's Guide`_
+* `The pkg_resources API reference`_
+* `The Internal Structure of Python Eggs`_
+
+Questions, comments, and bug reports should be directed to the `distutils-sig
+mailing list`_.  If you have written (or know of) any tutorials, documentation,
+plug-ins, or other resources for setuptools users, please let us know about
+them there, so this reference list can be updated.  If you have working,
+*tested* patches to correct problems or add features, you may submit them to
+the `setuptools bug tracker`_.
+
+.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
+.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
+.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
+.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
+.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
+.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
+
+
+-------
+Credits
+-------
+
+* The original design for the ``.egg`` format and the ``pkg_resources`` API was
+  co-created by Phillip Eby and Bob Ippolito.  Bob also implemented the first
+  version of ``pkg_resources``, and supplied the OS X operating system version
+  compatibility algorithm.
+
+* Ian Bicking implemented many early "creature comfort" features of
+  easy_install, including support for downloading via Sourceforge and
+  Subversion repositories.  Ian's comments on the Web-SIG about WSGI
+  application deployment also inspired the concept of "entry points" in eggs,
+  and he has given talks at PyCon and elsewhere to inform and educate the
+  community about eggs and setuptools.
+
+* Jim Fulton contributed time and effort to build automated tests of various
+  aspects of ``easy_install``, and supplied the doctests for the command-line
+  ``.exe`` wrappers on Windows.
+
+* Phillip J. Eby is the seminal author of setuptools, and
+  first proposed the idea of an importable binary distribution format for
+  Python application plug-ins.
+
+* Significant parts of the implementation of setuptools were funded by the Open
+  Source Applications Foundation, to provide a plug-in infrastructure for the
+  Chandler PIM application.  In addition, many OSAF staffers (such as Mike
+  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
+  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)
+
+* Tarek Ziadé is the principal author of the Distribute fork, which
+  re-invigorated the community on the project, encouraged renewed innovation,
+  and addressed many defects.
+
+* Since the merge with Distribute, Jason R. Coombs is the
+  maintainer of setuptools.  The project is maintained in coordination with
+  the Python Packaging Authority (PyPA) and the larger Python community.
+
+.. _files:
+
+
+---------------
+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`_.
+
+.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
+
+
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/RECORD b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/RECORD
new file mode 100644
index 0000000..c3ee3cb
--- /dev/null
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/RECORD
@@ -0,0 +1,124 @@
+easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
+_markerlib/__init__.py,sha256=GSmhZqvAitLJHhSgtqqusfq2nJ_ClP3oy3Lm0uZLIsU,552
+_markerlib/markers.py,sha256=YuFp0-osufFIoqnzG3L0Z2fDCx4Vln3VUDeXJ2DA_1I,3979
+pkg_resources/__init__.py,sha256=wjwAz-dydtKPf8thmjy95GDMQj-Swp9mY0xnBfjrnNU,106955
+pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pkg_resources/_vendor/packaging/__about__.py,sha256=YzdrW-1lWmyCBDyrcNkZbJo4tiDWXpoiqPjfyCYMzIE,1073
+pkg_resources/_vendor/packaging/__init__.py,sha256=2V8n-eEpSgBuXlV8hlMmhU7ZklpsrrusWMZNp2gC4Hs,906
+pkg_resources/_vendor/packaging/_compat.py,sha256=wofog8iYo_zudt_10i6JiXKHDs5GhCuXC09hCuSJiv4,1253
+pkg_resources/_vendor/packaging/_structures.py,sha256=93YvgrEE2HgFp8AdXy0pwCRVnZeutRHO_-puJ7T0cPw,1809
+pkg_resources/_vendor/packaging/specifiers.py,sha256=UV9T01_kKloA8PSeMI3HTYBSJ_4KLs00yLvrlciZ3yU,28079
+pkg_resources/_vendor/packaging/version.py,sha256=dEGrWZJZ6sef1xMxSfDCego2hS3Q86by0hUIFVk-AGc,11949
+setuptools/__init__.py,sha256=3k29_xXPwjFtkdBbuqaQ-VA3_Mdqyq4ADDIwfsc9ISo,5424
+setuptools/archive_util.py,sha256=N30WE5ZQjkytzhAodAXw4FkK-9J5AP1ChrClHnZthOA,6609
+setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
+setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
+setuptools/cli-arm-32.exe,sha256=0pFNIi2SmY2gdY91Y4LRhj1wuBsnv5cG1fus3iBJv40,69120
+setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
+setuptools/compat.py,sha256=-Hl58PuLOEHUDM3-qsgmk50qNiyLLF3RgBgJ-eGGZG0,2094
+setuptools/depends.py,sha256=gMRnrqQSr_Yp_wf09O88vKSQah1YjjEi5PsDNezM2Hs,6370
+setuptools/dist.py,sha256=alEPOcofbGQSfkVQk6h0yEGNyKiQyCvNQa5YmnUm6wU,35320
+setuptools/extension.py,sha256=nQ9GFTKxRIwmE1W7t1ZSBmuPAUJK_gVRYOCwxA1L38U,1649
+setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
+setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264
+setuptools/gui-arm-32.exe,sha256=R5gRWLkY7wvO_CVGxoi7LZVTv0h-DKsKScy6fkbp4XI,69120
+setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
+setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998
+setuptools/msvc9_support.py,sha256=fo2vjb-dna1SEuHezQCTuelCo6XFBv5cqaI56ABJ1vw,2187
+setuptools/package_index.py,sha256=aavWGle1RtmelMjeTOxjFoGpEdGdGY4hfRnLHUkbD0c,38760
+setuptools/py26compat.py,sha256=ggKS8_aZWWHHS792vF3uXp5vmUkGNk3vjLreLTHr_-Q,431
+setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306
+setuptools/py31compat.py,sha256=O3X_wdWrvXTifeSFbRaCMuc23cDhMHJn7QlITb5cQ8E,1637
+setuptools/sandbox.py,sha256=Gg5UfpsC5xsg_1x68pWRXG4t3nRWNpTk7m13lrnMTKw,13925
+setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201
+setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
+setuptools/site-patch.py,sha256=K-0-cAx36mX_PG-qPZwosG9ZLCliRjquKQ4nHiJvvzg,2389
+setuptools/ssl_support.py,sha256=FASqXlRCmXAi6LUWLUIo0u14MpJqHBgkOc5KPHSRrtI,8044
+setuptools/unicode_utils.py,sha256=gvhAHRj1LELCz-1MP3rfXGi__O1CAm5aksO9Njd2lpU,981
+setuptools/utils.py,sha256=08Z7mt-9mvrx-XvmS5EyKoRn2lxNTlgFsUwBU3Eq9JQ,293
+setuptools/version.py,sha256=W6a-yPsQfjwnpsU1B2d5fZfcOncwpcyOHMQnCQedRdo,23
+setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714
+setuptools/command/__init__.py,sha256=gQMXoLa0TtUtmUZY0ptSouWWA5kcTArWyDQ6QwkjoVQ,554
+setuptools/command/alias.py,sha256=1sLQxZcNh6dDQpDmm4G7UGGTol83nY1NTPmNBbm2siI,2381
+setuptools/command/bdist_egg.py,sha256=3eblnHDm1t8Hwh8K5z1QaWOVkxUvxQc40KV_YZVHNFs,17184
+setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508
+setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637
+setuptools/command/build_ext.py,sha256=pkQ8xp3YPVGGLkGv-SvfxC_GqFpboph1AFEoMFOgQMo,11964
+setuptools/command/build_py.py,sha256=uTgiBroMgyV-Lq4Kt42PLWQknM9G8c8_6TiDv4H5_Sw,7915
+setuptools/command/develop.py,sha256=YJ0VZZDKRiUHcbBOsdrv9vt2SvF5qP5Pnpg1nEFVLHU,7390
+setuptools/command/easy_install.py,sha256=gE0vMkTJk_xIQnQBEH05OVSvqzDYeIPJ1Bl6wPKlP7w,87197
+setuptools/command/egg_info.py,sha256=7AEcwMZQ5zl48_Cu_srTxCUqlJBokW10jRlFHZof2fs,16852
+setuptools/command/install.py,sha256=QwaFiZRU3ytIHoPh8uJ9EqV3Fu9C4ca4B7UGAo95tws,4685
+setuptools/command/install_egg_info.py,sha256=KXNB8O34-rK-cZZZr2fnT8kqNktDmTfUA88X2Iln66c,4001
+setuptools/command/install_lib.py,sha256=ntpy-9xiFHfDmXmX_Lfp7nMchw7FpgyP66H7reixI_Y,3771
+setuptools/command/install_scripts.py,sha256=vX2JC6v7l090N7CrTfihWBklNbPvfNKAY2LRtukM9XE,2231
+setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
+setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270
+setuptools/command/rotate.py,sha256=Qm7SOa32L9XG5b_C7_SSYvKM5rqFXroeQ6w8GXIsY2o,2038
+setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
+setuptools/command/sdist.py,sha256=rMT2qS0u4GYJtL4IXiYG-ElEa111wqzQVHpv9uE1L5w,7079
+setuptools/command/setopt.py,sha256=Z3_kav60D2XHZjM0cRhGo7wbBYo7nr4U_U-wMMbpmu8,5080
+setuptools/command/test.py,sha256=yJEniqTzav6R6vimRG3tb7l233rGDSAmFafXIHe9UzU,6562
+setuptools/command/upload_docs.py,sha256=di-XRGtxW5TSFYR6nK9XZj3I5JIU4V00SOFRhptdOGc,6782
+setuptools-18.6.1.dist-info/DESCRIPTION.rst,sha256=MDsJej8DPV2OKpAKpu74g-2xksRd-uGTeZn4W7D1dnI,9940
+setuptools-18.6.1.dist-info/METADATA,sha256=BGDHyQol2zJcIYSK_3NFq5WWiMNwMyE70hcRvc-RkVg,11258
+setuptools-18.6.1.dist-info/RECORD,,
+setuptools-18.6.1.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110
+setuptools-18.6.1.dist-info/dependency_links.txt,sha256=g1tkmtmOY1n1KRGVLZKBtbJf0CCZ2Jil8uGvMfQRJNE,226
+setuptools-18.6.1.dist-info/entry_points.txt,sha256=xrrbAWSD2o_blM5eb2oXvmCTvfdcjUMunUT4T8C-AAs,2793
+setuptools-18.6.1.dist-info/metadata.json,sha256=N4CabK365JZ5kk7fTtRotnvUQKwHl4IFYF1xPRhtoHc,4680
+setuptools-18.6.1.dist-info/top_level.txt,sha256=7780fzudMJkykiTcIrAQ8m8Lll6kot3EEePye3VJgEE,49
+setuptools-18.6.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
+/home/j/oml/platform/Linux_i686/home/.local/bin/easy_install,sha256=7h7lc5DCAhnE08UwEm49wGymGDGdOcrkRdncTKYmXIQ,233
+/home/j/oml/platform/Linux_i686/home/.local/bin/easy_install-3.4,sha256=7h7lc5DCAhnE08UwEm49wGymGDGdOcrkRdncTKYmXIQ,233
+setuptools/__pycache__/site-patch.cpython-34.pyc,,
+setuptools/__pycache__/unicode_utils.cpython-34.pyc,,
+pkg_resources/_vendor/__pycache__/__init__.cpython-34.pyc,,
+setuptools/__pycache__/ssl_support.cpython-34.pyc,,
+__pycache__/easy_install.cpython-34.pyc,,
+setuptools/command/__pycache__/rotate.cpython-34.pyc,,
+setuptools/__pycache__/utils.cpython-34.pyc,,
+setuptools/__pycache__/compat.cpython-34.pyc,,
+setuptools/command/__pycache__/alias.cpython-34.pyc,,
+setuptools/__pycache__/depends.cpython-34.pyc,,
+setuptools/command/__pycache__/develop.cpython-34.pyc,,
+setuptools/__pycache__/__init__.cpython-34.pyc,,
+setuptools/command/__pycache__/install_lib.cpython-34.pyc,,
+setuptools/command/__pycache__/egg_info.cpython-34.pyc,,
+setuptools/__pycache__/py31compat.cpython-34.pyc,,
+setuptools/command/__pycache__/install_scripts.cpython-34.pyc,,
+setuptools/command/__pycache__/__init__.cpython-34.pyc,,
+setuptools/command/__pycache__/build_ext.cpython-34.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,,
+setuptools/__pycache__/dist.cpython-34.pyc,,
+_markerlib/__pycache__/__init__.cpython-34.pyc,,
+setuptools/__pycache__/py26compat.cpython-34.pyc,,
+setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,,
+setuptools/__pycache__/py27compat.cpython-34.pyc,,
+setuptools/__pycache__/msvc9_support.cpython-34.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,,
+setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,,
+setuptools/command/__pycache__/upload_docs.cpython-34.pyc,,
+setuptools/command/__pycache__/test.cpython-34.pyc,,
+setuptools/command/__pycache__/saveopts.cpython-34.pyc,,
+setuptools/__pycache__/package_index.cpython-34.pyc,,
+setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,,
+setuptools/__pycache__/archive_util.cpython-34.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/version.cpython-34.pyc,,
+_markerlib/__pycache__/markers.cpython-34.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-34.pyc,,
+setuptools/command/__pycache__/register.cpython-34.pyc,,
+setuptools/__pycache__/extension.cpython-34.pyc,,
+setuptools/command/__pycache__/sdist.cpython-34.pyc,,
+setuptools/__pycache__/version.cpython-34.pyc,,
+setuptools/command/__pycache__/install.cpython-34.pyc,,
+setuptools/command/__pycache__/build_py.cpython-34.pyc,,
+setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,,
+setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,,
+setuptools/command/__pycache__/easy_install.cpython-34.pyc,,
+setuptools/__pycache__/sandbox.cpython-34.pyc,,
+setuptools/__pycache__/windows_support.cpython-34.pyc,,
+setuptools/command/__pycache__/setopt.cpython-34.pyc,,
+pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,,
+pkg_resources/__pycache__/__init__.cpython-34.pyc,,
diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/WHEEL b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/WHEEL
similarity index 70%
rename from Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/WHEEL
rename to Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/WHEEL
index 9dff69d..0de529b 100644
--- a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/WHEEL
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/WHEEL
@@ -1,5 +1,5 @@
 Wheel-Version: 1.0
-Generator: bdist_wheel (0.24.0)
+Generator: bdist_wheel (0.26.0)
 Root-Is-Purelib: true
 Tag: py2-none-any
 Tag: py3-none-any
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/dependency_links.txt b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/dependency_links.txt
similarity index 50%
rename from Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/dependency_links.txt
rename to Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/dependency_links.txt
index b454c16..b0477ad 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/dependency_links.txt
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/dependency_links.txt
@@ -1,2 +1,2 @@
-https://pypi.python.org/packages/source/c/certifi/certifi-1.0.1.tar.gz#md5=45f5cb94b8af9e1df0f9450a8f61b790
+https://pypi.python.org/packages/source/c/certifi/certifi-2015.04.28.tar.gz#md5=12c7c3a063b2ff97a0f8291d8de41e8c
 https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/entry_points.txt b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/entry_points.txt
similarity index 95%
rename from Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/entry_points.txt
rename to Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/entry_points.txt
index 72a5ffe..ef17af1 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/entry_points.txt
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/entry_points.txt
@@ -1,6 +1,6 @@
 [console_scripts]
 easy_install = setuptools.command.easy_install:main
-easy_install-3.4 = setuptools.command.easy_install:main
+easy_install-3.5 = setuptools.command.easy_install:main
 
 [distutils.commands]
 alias = setuptools.command.alias:alias
@@ -56,9 +56,6 @@ 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.file_finders]
-svn_cvs = setuptools.command.sdist:_default_revctrl
-
 [setuptools.installation]
 eggsecutable = setuptools.command.easy_install:bootstrap
 
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/metadata.json b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/metadata.json
new file mode 100644
index 0000000..a6e5784
--- /dev/null
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/metadata.json
@@ -0,0 +1 @@
+{"generator": "bdist_wheel (0.26.0)", "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Python Software Foundation License", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.details": {"project_urls": {"Home": "https://bitbucket.org/pypa/setuptools"}, "contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.5": "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_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "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_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", "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"}}, "python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.5": "setuptools.command.easy_install:main"}}}, "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "license": "PSF or ZPL", "metadata_version": "2.0", "name": "setuptools", "extras": ["certs", "ssl"], "run_requires": [{"requires": ["certifi (==2015.04.28)"], "extra": "certs"}, {"requires": ["wincertstore (==0.2)"], "extra": "ssl", "environment": "sys_platform=='win32'"}], "version": "18.6.1", "test_requires": [{"requires": ["pytest", "setuptools[ssl]"]}]}
\ No newline at end of file
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/top_level.txt
similarity index 100%
rename from Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/top_level.txt
rename to Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/top_level.txt
diff --git a/Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/not-zip-safe b/Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/zip-safe
similarity index 100%
rename from Linux_i686/lib/python3.4/site-packages/cffi-0.8.6.egg-info/not-zip-safe
rename to Linux_i686/lib/python3.4/site-packages/setuptools-18.6.1.dist-info/zip-safe
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/DESCRIPTION.rst b/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/DESCRIPTION.rst
deleted file mode 100644
index 1e4e517..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/DESCRIPTION.rst
+++ /dev/null
@@ -1,2111 +0,0 @@
-===============================
-Installing and Using Setuptools
-===============================
-
-.. contents:: **Table of Contents**
-
-
--------------------------
-Installation Instructions
--------------------------
-
-The recommended way to bootstrap setuptools on any system is to download
-`ez_setup.py`_ and run it using the target Python environment. Different
-operating systems have different recommended techniques to accomplish this
-basic routine, so below are some examples to get you started.
-
-Setuptools requires Python 2.6 or later. To install setuptools
-on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
-`_.
-
-The link provided to ez_setup.py is a bookmark to bootstrap script for the
-latest known stable release.
-
-.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
-
-Windows (Powershell 3 or later)
-===============================
-
-For best results, uninstall previous versions FIRST (see `Uninstalling`_).
-
-Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
-with PowerShell 3 installed, it's possible to install with one simple
-Powershell command. Start up Powershell and paste this command::
-
-    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
-
-You must start the Powershell with Administrative privileges or you may choose
-to install a user-local installation::
-
-    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
-
-If you have Python 3.3 or later, you can use the ``py`` command to install to
-different Python versions. For example, to install to Python 3.3 if you have
-Python 2.7 installed::
-
-    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
-
-The recommended way to install setuptools on Windows is to download
-`ez_setup.py`_ and run it. The script will download the appropriate
-distribution file and install it for you.
-
-Once installation is complete, you will find an ``easy_install`` program in
-your Python ``Scripts`` subdirectory.  For simple invocation and best results,
-add this directory to your ``PATH`` environment variable, if it is not already
-present. If you did a user-local install, the ``Scripts`` subdirectory is
-``$env:APPDATA\Python\Scripts``.
-
-
-Windows (simplified)
-====================
-
-For Windows without PowerShell 3 or for installation without a command-line,
-download `ez_setup.py`_ using your preferred web browser or other technique
-and "run" that file.
-
-
-Unix (wget)
-===========
-
-Most Linux distributions come with wget.
-
-Download `ez_setup.py`_ and run it using the target Python version. The script
-will download the appropriate version and install it for you::
-
-    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python
-
-Note that you will may need to invoke the command with superuser privileges to
-install to the system Python::
-
-    > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
-
-Alternatively, Setuptools may be installed to a user-local path::
-
-    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
-
-Unix including Mac OS X (curl)
-==============================
-
-If your system has curl installed, follow the ``wget`` instructions but
-replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
-
-    > curl https://bootstrap.pypa.io/ez_setup.py -o - | python
-
-
-Advanced Installation
-=====================
-
-For more advanced installation options, such as installing to custom
-locations or prefixes, download and extract the source
-tarball from `Setuptools on PyPI `_
-and run setup.py with any supported distutils and Setuptools options.
-For example::
-
-    setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
-
-Use ``--help`` to get a full options list, but we recommend consulting
-the `EasyInstall manual`_ for detailed instructions, especially `the section
-on custom installation locations`_.
-
-.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
-.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
-
-
-Downloads
-=========
-
-All setuptools downloads can be found at `the project's home page in the Python
-Package Index`_.  Scroll to the very bottom of the page to find the links.
-
-.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
-
-In addition to the PyPI downloads, the development version of ``setuptools``
-is available from the `Bitbucket repo`_, and in-development versions of the
-`0.6 branch`_ are available as well.
-
-.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
-.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
-
-Uninstalling
-============
-
-On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
-installer, simply use the uninstall feature of "Add/Remove Programs" in the
-Control Panel.
-
-Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
-version, delete all ``setuptools*`` and ``distribute*`` files and
-directories from your system's ``site-packages`` directory
-(and any other ``sys.path`` directories) FIRST.
-
-If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
-nothing further needs to be done. If you want to completely remove Setuptools,
-you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
-and associated executables installed to the Python scripts directory.
-
---------------------------------
-Using Setuptools and EasyInstall
---------------------------------
-
-Here are some of the available manuals, tutorials, and other resources for
-learning about Setuptools, Python Eggs, and EasyInstall:
-
-* `The EasyInstall user's guide and reference manual`_
-* `The setuptools Developer's Guide`_
-* `The pkg_resources API reference`_
-* `Package Compatibility Notes`_ (user-maintained)
-* `The Internal Structure of Python Eggs`_
-
-Questions, comments, and bug reports should be directed to the `distutils-sig
-mailing list`_.  If you have written (or know of) any tutorials, documentation,
-plug-ins, or other resources for setuptools users, please let us know about
-them there, so this reference list can be updated.  If you have working,
-*tested* patches to correct problems or add features, you may submit them to
-the `setuptools bug tracker`_.
-
-.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
-.. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes
-.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
-.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
-.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
-.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
-.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
-
-
--------
-Credits
--------
-
-* The original design for the ``.egg`` format and the ``pkg_resources`` API was
-  co-created by Phillip Eby and Bob Ippolito.  Bob also implemented the first
-  version of ``pkg_resources``, and supplied the OS X operating system version
-  compatibility algorithm.
-
-* Ian Bicking implemented many early "creature comfort" features of
-  easy_install, including support for downloading via Sourceforge and
-  Subversion repositories.  Ian's comments on the Web-SIG about WSGI
-  application deployment also inspired the concept of "entry points" in eggs,
-  and he has given talks at PyCon and elsewhere to inform and educate the
-  community about eggs and setuptools.
-
-* Jim Fulton contributed time and effort to build automated tests of various
-  aspects of ``easy_install``, and supplied the doctests for the command-line
-  ``.exe`` wrappers on Windows.
-
-* Phillip J. Eby is the seminal author of setuptools, and
-  first proposed the idea of an importable binary distribution format for
-  Python application plug-ins.
-
-* Significant parts of the implementation of setuptools were funded by the Open
-  Source Applications Foundation, to provide a plug-in infrastructure for the
-  Chandler PIM application.  In addition, many OSAF staffers (such as Mike
-  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
-  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)
-
-* Tarek Ziadé is the principal author of the Distribute fork, which
-  re-invigorated the community on the project, encouraged renewed innovation,
-  and addressed many defects.
-
-* Since the merge with Distribute, Jason R. Coombs is the
-  maintainer of setuptools.  The project is maintained in coordination with
-  the Python Packaging Authority (PyPA) and the larger Python community.
-
-.. _files:
-
-=======
-CHANGES
-=======
-
------
-6.0.2
------
-
-* `Issue #262 `_: Fixed regression in pip install due to egg-info directories
-  being omitted. Re-opens `Issue #118 `_.
-
------
-6.0.1
------
-
-* `Issue #259 `_: Fixed regression with namespace package handling on ``single
-  version, externally managed`` installs.
-
----
-6.0
----
-
-* `Issue #100 `_: When building a distribution, Setuptools will no longer match
-  default files using platform-dependent case sensitivity, but rather will
-  only match the files if their case matches exactly. As a result, on Windows
-  and other case-insensitive file systems, files with names such as
-  'readme.txt' or 'README.TXT' will be omitted from the distribution and a
-  warning will be issued indicating that 'README.txt' was not found. Other
-  filenames affected are:
-
-    - README.rst
-    - README
-    - setup.cfg
-    - setup.py (or the script name)
-    - test/test*.py
-
-  Any users producing distributions with filenames that match those above
-  case-insensitively, but not case-sensitively, should rename those files in
-  their repository for better portability.
-* `Pull Request #72 `_: When using ``single_version_externally_managed``, the
-  exclusion list now includes Python 3.2 ``__pycache__`` entries.
-* `Pull Request #76 `_ and `Pull Request #78 `_: lines in top_level.txt are now
-  ordered deterministically.
-* `Issue #118 `_: The egg-info directory is now no longer included in the list
-  of outputs.
-* `Issue #258 `_: Setuptools now patches distutils msvc9compiler to
-  recognize the specially-packaged compiler package for easy extension module
-  support on Python 2.6, 2.7, and 3.2.
-
----
-5.8
----
-
-* `Issue #237 `_: ``pkg_resources`` now uses explicit detection of Python 2 vs.
-  Python 3, supporting environments where builtins have been patched to make
-  Python 3 look more like Python 2.
-
----
-5.7
----
-
-* `Issue #240 `_: Based on real-world performance measures against 5.4, zip
-  manifests are now cached in all circumstances. The
-  ``PKG_RESOURCES_CACHE_ZIP_MANIFESTS`` environment variable is no longer
-  relevant. The observed "memory increase" referenced in the 5.4 release
-  notes and detailed in `Issue #154 `_ was likely not an increase over the status
-  quo, but rather only an increase over not storing the zip info at all.
-
----
-5.6
----
-
-* `Issue #242 `_: Use absolute imports in svn_utils to avoid issues if the
-  installing package adds an xml module to the path.
-
------
-5.5.1
------
-
-* `Issue #239 `_: Fix typo in 5.5 such that fix did not take.
-
----
-5.5
----
-
-* `Issue #239 `_: Setuptools now includes the setup_requires directive on
-  Distribution objects and validates the syntax just like install_requires
-  and tests_require directives.
-
------
-5.4.2
------
-
-* `Issue #236 `_: Corrected regression in execfile implementation for Python 2.6.
-
------
-5.4.1
------
-
-* `Python #7776 `_: (ssl_support) Correct usage of host for validation when
-  tunneling for HTTPS.
-
----
-5.4
----
-
-* `Issue #154 `_: ``pkg_resources`` will now cache the zip manifests rather than
-  re-processing the same file from disk multiple times, but only if the
-  environment variable ``PKG_RESOURCES_CACHE_ZIP_MANIFESTS`` is set. Clients
-  that package many modules in the same zip file will see some improvement
-  in startup time by enabling this feature. This feature is not enabled by
-  default because it causes a substantial increase in memory usage.
-
----
-5.3
----
-
-* `Issue #185 `_: Make svn tagging work on the new style SVN metadata.
-  Thanks cazabon!
-* Prune revision control directories (e.g .svn) from base path
-  as well as sub-directories.
-
----
-5.2
----
-
-* Added a `Developer Guide
-  `_ to the official
-  documentation.
-* Some code refactoring and cleanup was done with no intended behavioral
-  changes.
-* During install_egg_info, the generated lines for namespace package .pth
-  files are now processed even during a dry run.
-
----
-5.1
----
-
-* `Issue #202 `_: Implemented more robust cache invalidation for the ZipImporter,
-  building on the work in `Issue #168 `_. Special thanks to Jurko Gospodnetic and
-  PJE.
-
------
-5.0.2
------
-
-* `Issue #220 `_: Restored script templates.
-
------
-5.0.1
------
-
-* Renamed script templates to end with .tmpl now that they no longer need
-  to be processed by 2to3. Fixes spurious syntax errors during build/install.
-
----
-5.0
----
-
-* `Issue #218 `_: Re-release of 3.8.1 to signal that it supersedes 4.x.
-* Incidentally, script templates were updated not to include the triple-quote
-  escaping.
-
--------------------------
-3.7.1 and 3.8.1 and 4.0.1
--------------------------
-
-* `Issue #213 `_: Use legacy StringIO behavior for compatibility under pbr.
-* `Issue #218 `_: Setuptools 3.8.1 superseded 4.0.1, and 4.x was removed
-  from the available versions to install.
-
----
-4.0
----
-
-* `Issue #210 `_: ``setup.py develop`` now copies scripts in binary mode rather
-  than text mode, matching the behavior of the ``install`` command.
-
----
-3.8
----
-
-* Extend `Issue #197 `_ workaround to include all Python 3 versions prior to
-  3.2.2.
-
----
-3.7
----
-
-* `Issue #193 `_: Improved handling of Unicode filenames when building manifests.
-
----
-3.6
----
-
-* `Issue #203 `_: Honor proxy settings for Powershell downloader in the bootstrap
-  routine.
-
------
-3.5.2
------
-
-* `Issue #168 `_: More robust handling of replaced zip files and stale caches.
-  Fixes ZipImportError complaining about a 'bad local header'.
-
------
-3.5.1
------
-
-* `Issue #199 `_: Restored ``install._install`` for compatibility with earlier
-  NumPy versions.
-
----
-3.5
----
-
-* `Issue #195 `_: Follow symbolic links in find_packages (restoring behavior
-  broken in 3.4).
-* `Issue #197 `_: On Python 3.1, PKG-INFO is now saved in a UTF-8 encoding instead
-  of ``sys.getpreferredencoding`` to match the behavior on Python 2.6-3.4.
-* `Issue #192 `_: Preferred bootstrap location is now
-  https://bootstrap.pypa.io/ez_setup.py (mirrored from former location).
-
------
-3.4.4
------
-
-* `Issue #184 `_: Correct failure where find_package over-matched packages
-  when directory traversal isn't short-circuited.
-
------
-3.4.3
------
-
-* `Issue #183 `_: Really fix test command with Python 3.1.
-
------
-3.4.2
------
-
-* `Issue #183 `_: Fix additional regression in test command on Python 3.1.
-
------
-3.4.1
------
-
-* `Issue #180 `_: Fix regression in test command not caught by py.test-run tests.
-
----
-3.4
----
-
-* `Issue #176 `_: Add parameter to the test command to support a custom test
-  runner: --test-runner or -r.
-* `Issue #177 `_: Now assume most common invocation to install command on
-  platforms/environments without stack support (issuing a warning). Setuptools
-  now installs naturally on IronPython. Behavior on CPython should be
-  unchanged.
-
----
-3.3
----
-
-* Add ``include`` parameter to ``setuptools.find_packages()``.
-
----
-3.2
----
-
-* `Pull Request #39 `_: Add support for C++ targets from Cython ``.pyx`` files.
-* `Issue #162 `_: Update dependency on certifi to 1.0.1.
-* `Issue #164 `_: Update dependency on wincertstore to 0.2.
-
----
-3.1
----
-
-* `Issue #161 `_: Restore Features functionality to allow backward compatibility
-  (for Features) until the uses of that functionality is sufficiently removed.
-
------
-3.0.2
------
-
-* Correct typo in previous bugfix.
-
------
-3.0.1
------
-
-* `Issue #157 `_: Restore support for Python 2.6 in bootstrap script where
-  ``zipfile.ZipFile`` does not yet have support for context managers.
-
----
-3.0
----
-
-* `Issue #125 `_: Prevent Subversion support from creating a ~/.subversion
-  directory just for checking the presence of a Subversion repository.
-* `Issue #12 `_: Namespace packages are now imported lazily.  That is, the mere
-  declaration of a namespace package in an egg on ``sys.path`` no longer
-  causes it to be imported when ``pkg_resources`` is imported.  Note that this
-  change means that all of a namespace package's ``__init__.py`` files must
-  include a ``declare_namespace()`` call in order to ensure that they will be
-  handled properly at runtime.  In 2.x it was possible to get away without
-  including the declaration, but only at the cost of forcing namespace
-  packages to be imported early, which 3.0 no longer does.
-* `Issue #148 `_: When building (bdist_egg), setuptools no longer adds
-  ``__init__.py`` files to namespace packages. Any packages that rely on this
-  behavior will need to create ``__init__.py`` files and include the
-  ``declare_namespace()``.
-* `Issue #7 `_: Setuptools itself is now distributed as a zip archive in addition to
-  tar archive. ez_setup.py now uses zip archive. This approach avoids the potential
-  security vulnerabilities presented by use of tar archives in ez_setup.py.
-  It also leverages the security features added to ZipFile.extract in Python 2.7.4.
-* `Issue #65 `_: Removed deprecated Features functionality.
-* `Pull Request #28 `_: Remove backport of ``_bytecode_filenames`` which is
-  available in Python 2.6 and later, but also has better compatibility with
-  Python 3 environments.
-* `Issue #156 `_: Fix spelling of __PYVENV_LAUNCHER__ variable.
-
----
-2.2
----
-
-* `Issue #141 `_: Restored fix for allowing setup_requires dependencies to
-  override installed dependencies during setup.
-* `Issue #128 `_: Fixed issue where only the first dependency link was honored
-  in a distribution where multiple dependency links were supplied.
-
------
-2.1.2
------
-
-* `Issue #144 `_: Read long_description using codecs module to avoid errors
-  installing on systems where LANG=C.
-
------
-2.1.1
------
-
-* `Issue #139 `_: Fix regression in re_finder for CVS repos (and maybe Git repos
-  as well).
-
----
-2.1
----
-
-* `Issue #129 `_: Suppress inspection of ``*.whl`` files when searching for files
-  in a zip-imported file.
-* `Issue #131 `_: Fix RuntimeError when constructing an egg fetcher.
-
------
-2.0.2
------
-
-* Fix NameError during installation with Python implementations (e.g. Jython)
-  not containing parser module.
-* Fix NameError in ``sdist:re_finder``.
-
------
-2.0.1
------
-
-* `Issue #124 `_: Fixed error in list detection in upload_docs.
-
----
-2.0
----
-
-* `Issue #121 `_: Exempt lib2to3 pickled grammars from DirectorySandbox.
-* `Issue #41 `_: Dropped support for Python 2.4 and Python 2.5. Clients requiring
-  setuptools for those versions of Python should use setuptools 1.x.
-* Removed ``setuptools.command.easy_install.HAS_USER_SITE``. Clients
-  expecting this boolean variable should use ``site.ENABLE_USER_SITE``
-  instead.
-* Removed ``pkg_resources.ImpWrapper``. Clients that expected this class
-  should use ``pkgutil.ImpImporter`` instead.
-
------
-1.4.2
------
-
-* `Issue #116 `_: Correct TypeError when reading a local package index on Python
-  3.
-
------
-1.4.1
------
-
-* `Issue #114 `_: Use ``sys.getfilesystemencoding`` for decoding config in
-  ``bdist_wininst`` distributions.
-
-* `Issue #105 `_ and `Issue #113 `_: Establish a more robust technique for
-  determining the terminal encoding::
-
-    1. Try ``getpreferredencoding``
-    2. If that returns US_ASCII or None, try the encoding from
-       ``getdefaultlocale``. If that encoding was a "fallback" because Python
-       could not figure it out from the environment or OS, encoding remains
-       unresolved.
-    3. If the encoding is resolved, then make sure Python actually implements
-       the encoding.
-    4. On the event of an error or unknown codec, revert to fallbacks
-       (UTF-8 on Darwin, ASCII on everything else).
-    5. On the encoding is 'mac-roman' on Darwin, use UTF-8 as 'mac-roman' was
-       a bug on older Python releases.
-
-    On a side note, it would seem that the encoding only matters for when SVN
-    does not yet support ``--xml`` and when getting repository and svn version
-    numbers. The ``--xml`` technique should yield UTF-8 according to some
-    messages on the SVN mailing lists. So if the version numbers are always
-    7-bit ASCII clean, it may be best to only support the file parsing methods
-    for legacy SVN releases and support for SVN without the subprocess command
-    would simple go away as support for the older SVNs does.
-
----
-1.4
----
-
-* `Issue #27 `_: ``easy_install`` will now use credentials from .pypirc if
-  present for connecting to the package index.
-* `Pull Request #21 `_: Omit unwanted newlines in ``package_index._encode_auth``
-  when the username/password pair length indicates wrapping.
-
------
-1.3.2
------
-
-* `Issue #99 `_: Fix filename encoding issues in SVN support.
-
------
-1.3.1
------
-
-* Remove exuberant warning in SVN support when SVN is not used.
-
----
-1.3
----
-
-* Address security vulnerability in SSL match_hostname check as reported in
-  `Python #17997 `_.
-* Prefer `backports.ssl_match_hostname
-  `_ for backport
-  implementation if present.
-* Correct NameError in ``ssl_support`` module (``socket.error``).
-
----
-1.2
----
-
-* `Issue #26 `_: Add support for SVN 1.7. Special thanks to Philip Thiem for the
-  contribution.
-* `Issue #93 `_: Wheels are now distributed with every release. Note that as
-  reported in `Issue #108 `_, as of Pip 1.4, scripts aren't installed properly
-  from wheels. Therefore, if using Pip to install setuptools from a wheel,
-  the ``easy_install`` command will not be available.
-* Setuptools "natural" launcher support, introduced in 1.0, is now officially
-  supported.
-
------
-1.1.7
------
-
-* Fixed behavior of NameError handling in 'script template (dev).py' (script
-  launcher for 'develop' installs).
-* ``ez_setup.py`` now ensures partial downloads are cleaned up following
-  a failed download.
-* `Distribute #363 `_ and `Issue #55 `_: Skip an sdist test that fails on locales
-  other than UTF-8.
-
------
-1.1.6
------
-
-* `Distribute #349 `_: ``sandbox.execfile`` now opens the target file in binary
-  mode, thus honoring a BOM in the file when compiled.
-
------
-1.1.5
------
-
-* `Issue #69 `_: Second attempt at fix (logic was reversed).
-
------
-1.1.4
------
-
-* `Issue #77 `_: Fix error in upload command (Python 2.4).
-
------
-1.1.3
------
-
-* Fix NameError in previous patch.
-
------
-1.1.2
------
-
-* `Issue #69 `_: Correct issue where 404 errors are returned for URLs with
-  fragments in them (such as #egg=).
-
------
-1.1.1
------
-
-* `Issue #75 `_: Add ``--insecure`` option to ez_setup.py to accommodate
-  environments where a trusted SSL connection cannot be validated.
-* `Issue #76 `_: Fix AttributeError in upload command with Python 2.4.
-
----
-1.1
----
-
-* `Issue #71 `_ (`Distribute #333 `_): EasyInstall now puts less emphasis on the
-  condition when a host is blocked via ``--allow-hosts``.
-* `Issue #72 `_: Restored Python 2.4 compatibility in ``ez_setup.py``.
-
----
-1.0
----
-
-* `Issue #60 `_: On Windows, Setuptools supports deferring to another launcher,
-  such as Vinay Sajip's `pylauncher `_
-  (included with Python 3.3) to launch console and GUI scripts and not install
-  its own launcher executables. This experimental functionality is currently
-  only enabled if  the ``SETUPTOOLS_LAUNCHER`` environment variable is set to
-  "natural". In the future, this behavior may become default, but only after
-  it has matured and seen substantial adoption. The ``SETUPTOOLS_LAUNCHER``
-  also accepts "executable" to force the default behavior of creating launcher
-  executables.
-* `Issue #63 `_: Bootstrap script (ez_setup.py) now prefers Powershell, curl, or
-  wget for retrieving the Setuptools tarball for improved security of the
-  install. The script will still fall back to a simple ``urlopen`` on
-  platforms that do not have these tools.
-* `Issue #65 `_: Deprecated the ``Features`` functionality.
-* `Issue #52 `_: In ``VerifyingHTTPSConn``, handle a tunnelled (proxied)
-  connection.
-
-Backward-Incompatible Changes
-=============================
-
-This release includes a couple of backward-incompatible changes, but most if
-not all users will find 1.0 a drop-in replacement for 0.9.
-
-* `Issue #50 `_: Normalized API of environment marker support. Specifically,
-  removed line number and filename from SyntaxErrors when returned from
-  `pkg_resources.invalid_marker`. Any clients depending on the specific
-  string representation of exceptions returned by that function may need to
-  be updated to account for this change.
-* `Issue #50 `_: SyntaxErrors generated by `pkg_resources.invalid_marker` are
-  normalized for cross-implementation consistency.
-* Removed ``--ignore-conflicts-at-my-risk`` and ``--delete-conflicting``
-  options to easy_install. These options have been deprecated since 0.6a11.
-
------
-0.9.8
------
-
-* `Issue #53 `_: Fix NameErrors in `_vcs_split_rev_from_url`.
-
------
-0.9.7
------
-
-* `Issue #49 `_: Correct AttributeError on PyPy where a hashlib.HASH object does
-  not have a `.name` attribute.
-* `Issue #34 `_: Documentation now refers to bootstrap script in code repository
-  referenced by bookmark.
-* Add underscore-separated keys to environment markers (markerlib).
-
------
-0.9.6
------
-
-* `Issue #44 `_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name`
-  attribute.
-
------
-0.9.5
------
-
-* `Python #17980 `_: Fix security vulnerability in SSL certificate validation.
-
------
-0.9.4
------
-
-* `Issue #43 `_: Fix issue (introduced in 0.9.1) with version resolution when
-  upgrading over other releases of Setuptools.
-
------
-0.9.3
------
-
-* `Issue #42 `_: Fix new ``AttributeError`` introduced in last fix.
-
------
-0.9.2
------
-
-* `Issue #42 `_: Fix regression where blank checksums would trigger an
-  ``AttributeError``.
-
------
-0.9.1
------
-
-* `Distribute #386 `_: Allow other positional and keyword arguments to os.open.
-* Corrected dependency on certifi mis-referenced in 0.9.
-
----
-0.9
----
-
-* `package_index` now validates hashes other than MD5 in download links.
-
----
-0.8
----
-
-* Code base now runs on Python 2.4 - Python 3.3 without Python 2to3
-  conversion.
-
------
-0.7.8
------
-
-* `Distribute #375 `_: Yet another fix for yet another regression.
-
------
-0.7.7
------
-
-* `Distribute #375 `_: Repair AttributeError created in last release (redo).
-* `Issue #30 `_: Added test for get_cache_path.
-
------
-0.7.6
------
-
-* `Distribute #375 `_: Repair AttributeError created in last release.
-
------
-0.7.5
------
-
-* `Issue #21 `_: Restore Python 2.4 compatibility in ``test_easy_install``.
-* `Distribute #375 `_: Merged additional warning from Distribute 0.6.46.
-* Now honor the environment variable
-  ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now
-  deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``.
-
------
-0.7.4
------
-
-* `Issue #20 `_: Fix comparison of parsed SVN version on Python 3.
-
------
-0.7.3
------
-
-* `Issue #1 `_: Disable installation of Windows-specific files on non-Windows systems.
-* Use new sysconfig module with Python 2.7 or >=3.2.
-
------
-0.7.2
------
-
-* `Issue #14 `_: Use markerlib when the `parser` module is not available.
-* `Issue #10 `_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.
-
------
-0.7.1
------
-
-* Fix NameError (`Issue #3 `_) again - broken in bad merge.
-
----
-0.7
----
-
-* Merged Setuptools and Distribute. See docs/merge.txt for details.
-
-Added several features that were slated for setuptools 0.6c12:
-
-* Index URL now defaults to HTTPS.
-* Added experimental environment marker support. Now clients may designate a
-  PEP-426 environment marker for "extra" dependencies. Setuptools uses this
-  feature in ``setup.py`` for optional SSL and certificate validation support
-  on older platforms. Based on Distutils-SIG discussions, the syntax is
-  somewhat tentative. There should probably be a PEP with a firmer spec before
-  the feature should be considered suitable for use.
-* Added support for SSL certificate validation when installing packages from
-  an HTTPS service.
-
------
-0.7b4
------
-
-* `Issue #3 `_: Fixed NameError in SSL support.
-
-------
-0.6.49
-------
-
-* Move warning check in ``get_cache_path`` to follow the directory creation
-  to avoid errors when the cache path does not yet exist. Fixes the error
-  reported in `Distribute #375 `_.
-
-------
-0.6.48
-------
-
-* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
-  0.6.46 (redo).
-
-------
-0.6.47
-------
-
-* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
-  0.6.46.
-
-------
-0.6.46
-------
-
-* `Distribute #375 `_: Issue a warning if the PYTHON_EGG_CACHE or otherwise
-  customized egg cache location specifies a directory that's group- or
-  world-writable.
-
-------
-0.6.45
-------
-
-* `Distribute #379 `_: ``distribute_setup.py`` now traps VersionConflict as well,
-  restoring ability to upgrade from an older setuptools version.
-
-------
-0.6.44
-------
-
-* ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to
-  satisfy use_setuptools.
-
-------
-0.6.43
-------
-
-* `Distribute #378 `_: Restore support for Python 2.4 Syntax (regression in 0.6.42).
-
-------
-0.6.42
-------
-
-* External links finder no longer yields duplicate links.
-* `Distribute #337 `_: Moved site.py to setuptools/site-patch.py (graft of very old
-  patch from setuptools trunk which inspired PR `#31 `_).
-
-------
-0.6.41
-------
-
-* `Distribute #27 `_: Use public api for loading resources from zip files rather than
-  the private method `_zip_directory_cache`.
-* Added a new function ``easy_install.get_win_launcher`` which may be used by
-  third-party libraries such as buildout to get a suitable script launcher.
-
-------
-0.6.40
-------
-
-* `Distribute #376 `_: brought back cli.exe and gui.exe that were deleted in the
-  previous release.
-
-------
-0.6.39
-------
-
-* Add support for console launchers on ARM platforms.
-* Fix possible issue in GUI launchers where the subsystem was not supplied to
-  the linker.
-* Launcher build script now refactored for robustness.
-* `Distribute #375 `_: Resources extracted from a zip egg to the file system now also
-  check the contents of the file against the zip contents during each
-  invocation of get_resource_filename.
-
-------
-0.6.38
-------
-
-* `Distribute #371 `_: The launcher manifest file is now installed properly.
-
-------
-0.6.37
-------
-
-* `Distribute #143 `_: Launcher scripts, including easy_install itself, are now
-  accompanied by a manifest on 32-bit Windows environments to avoid the
-  Installer Detection Technology and thus undesirable UAC elevation described
-  in `this Microsoft article
-  `_.
-
-------
-0.6.36
-------
-
-* `Pull Request #35 `_: In `Buildout #64 `_, it was reported that
-  under Python 3, installation of distutils scripts could attempt to copy
-  the ``__pycache__`` directory as a file, causing an error, apparently only
-  under Windows. Easy_install now skips all directories when processing
-  metadata scripts.
-
-------
-0.6.35
-------
-
-
-Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
-how it parses version numbers.
-
-* `Distribute #278 `_: Restored compatibility with distribute 0.6.22 and setuptools
-  0.6. Updated the documentation to match more closely with the version
-  parsing as intended in setuptools 0.6.
-
-------
-0.6.34
-------
-
-* `Distribute #341 `_: 0.6.33 fails to build under Python 2.4.
-
-------
-0.6.33
-------
-
-* Fix 2 errors with Jython 2.5.
-* Fix 1 failure with Jython 2.5 and 2.7.
-* Disable workaround for Jython scripts on Linux systems.
-* `Distribute #336 `_: `setup.py` no longer masks failure exit code when tests fail.
-* Fix issue in pkg_resources where try/except around a platform-dependent
-  import would trigger hook load failures on Mercurial. See pull request 32
-  for details.
-* `Distribute #341 `_: Fix a ResourceWarning.
-
-------
-0.6.32
-------
-
-* Fix test suite with Python 2.6.
-* Fix some DeprecationWarnings and ResourceWarnings.
-* `Distribute #335 `_: Backed out `setup_requires` superceding installed requirements
-  until regression can be addressed.
-
-------
-0.6.31
-------
-
-* `Distribute #303 `_: Make sure the manifest only ever contains UTF-8 in Python 3.
-* `Distribute #329 `_: Properly close files created by tests for compatibility with
-  Jython.
-* Work around `Jython #1980 `_ and `Jython #1981 `_.
-* `Distribute #334 `_: Provide workaround for packages that reference `sys.__stdout__`
-  such as numpy does. This change should address
-  `virtualenv `#359 `_ `_ as long
-  as the system encoding is UTF-8 or the IO encoding is specified in the
-  environment, i.e.::
-
-     PYTHONIOENCODING=utf8 pip install numpy
-
-* Fix for encoding issue when installing from Windows executable on Python 3.
-* `Distribute #323 `_: Allow `setup_requires` requirements to supercede installed
-  requirements. Added some new keyword arguments to existing pkg_resources
-  methods. Also had to updated how __path__ is handled for namespace packages
-  to ensure that when a new egg distribution containing a namespace package is
-  placed on sys.path, the entries in __path__ are found in the same order they
-  would have been in had that egg been on the path when pkg_resources was
-  first imported.
-
-------
-0.6.30
-------
-
-* `Distribute #328 `_: Clean up temporary directories in distribute_setup.py.
-* Fix fatal bug in distribute_setup.py.
-
-------
-0.6.29
-------
-
-* `Pull Request #14 `_: Honor file permissions in zip files.
-* `Distribute #327 `_: Merged pull request `#24 `_ to fix a dependency problem with pip.
-* Merged pull request `#23 `_ to fix https://github.com/pypa/virtualenv/issues/301.
-* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
-  to produce uploadable documentation.
-* `Distribute #326 `_: `upload_docs` provided mangled auth credentials under Python 3.
-* `Distribute #320 `_: Fix check for "createable" in distribute_setup.py.
-* `Distribute #305 `_: Remove a warning that was triggered during normal operations.
-* `Distribute #311 `_: Print metadata in UTF-8 independent of platform.
-* `Distribute #303 `_: Read manifest file with UTF-8 encoding under Python 3.
-* `Distribute #301 `_: Allow to run tests of namespace packages when using 2to3.
-* `Distribute #304 `_: Prevent import loop in site.py under Python 3.3.
-* `Distribute #283 `_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
-* `Distribute #299 `_: The develop command didn't work on Python 3, when using 2to3,
-  as the egg link would go to the Python 2 source. Linking to the 2to3'd code
-  in build/lib makes it work, although you will have to rebuild the module
-  before testing it.
-* `Distribute #306 `_: Even if 2to3 is used, we build in-place under Python 2.
-* `Distribute #307 `_: Prints the full path when .svn/entries is broken.
-* `Distribute #313 `_: Support for sdist subcommands (Python 2.7)
-* `Distribute #314 `_: test_local_index() would fail an OS X.
-* `Distribute #310 `_: Non-ascii characters in a namespace __init__.py causes errors.
-* `Distribute #218 `_: Improved documentation on behavior of `package_data` and
-  `include_package_data`. Files indicated by `package_data` are now included
-  in the manifest.
-* `distribute_setup.py` now allows a `--download-base` argument for retrieving
-  distribute from a specified location.
-
-------
-0.6.28
-------
-
-* `Distribute #294 `_: setup.py can now be invoked from any directory.
-* Scripts are now installed honoring the umask.
-* Added support for .dist-info directories.
-* `Distribute #283 `_: Fix and disable scanning of `*.pyc` / `*.pyo` files on
-  Python 3.3.
-
-------
-0.6.27
-------
-
-* Support current snapshots of CPython 3.3.
-* Distribute now recognizes README.rst as a standard, default readme file.
-* Exclude 'encodings' modules when removing modules from sys.modules.
-  Workaround for `#285 `_.
-* `Distribute #231 `_: Don't fiddle with system python when used with buildout
-  (bootstrap.py)
-
-------
-0.6.26
-------
-
-* `Distribute #183 `_: Symlinked files are now extracted from source distributions.
-* `Distribute #227 `_: Easy_install fetch parameters are now passed during the
-  installation of a source distribution; now fulfillment of setup_requires
-  dependencies will honor the parameters passed to easy_install.
-
-------
-0.6.25
-------
-
-* `Distribute #258 `_: Workaround a cache issue
-* `Distribute #260 `_: distribute_setup.py now accepts the --user parameter for
-  Python 2.6 and later.
-* `Distribute #262 `_: package_index.open_with_auth no longer throws LookupError
-  on Python 3.
-* `Distribute #269 `_: AttributeError when an exception occurs reading Manifest.in
-  on late releases of Python.
-* `Distribute #272 `_: Prevent TypeError when namespace package names are unicode
-  and single-install-externally-managed is used. Also fixes PIP issue
-  449.
-* `Distribute #273 `_: Legacy script launchers now install with Python2/3 support.
-
-------
-0.6.24
-------
-
-* `Distribute #249 `_: Added options to exclude 2to3 fixers
-
-------
-0.6.23
-------
-
-* `Distribute #244 `_: Fixed a test
-* `Distribute #243 `_: Fixed a test
-* `Distribute #239 `_: Fixed a test
-* `Distribute #240 `_: Fixed a test
-* `Distribute #241 `_: Fixed a test
-* `Distribute #237 `_: Fixed a test
-* `Distribute #238 `_: easy_install now uses 64bit executable wrappers on 64bit Python
-* `Distribute #208 `_: Fixed parsed_versions, it now honors post-releases as noted in the documentation
-* `Distribute #207 `_: Windows cli and gui wrappers pass CTRL-C to child python process
-* `Distribute #227 `_: easy_install now passes its arguments to setup.py bdist_egg
-* `Distribute #225 `_: Fixed a NameError on Python 2.5, 2.4
-
-------
-0.6.21
-------
-
-* `Distribute #225 `_: FIxed a regression on py2.4
-
-------
-0.6.20
-------
-
-* `Distribute #135 `_: Include url in warning when processing URLs in package_index.
-* `Distribute #212 `_: Fix issue where easy_instal fails on Python 3 on windows installer.
-* `Distribute #213 `_: Fix typo in documentation.
-
-------
-0.6.19
-------
-
-* `Distribute #206 `_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'
-
-------
-0.6.18
-------
-
-* `Distribute #210 `_: Fixed a regression introduced by `Distribute #204 `_ fix.
-
-------
-0.6.17
-------
-
-* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
-  variable to allow to disable installation of easy_install-${version} script.
-* Support Python >=3.1.4 and >=3.2.1.
-* `Distribute #204 `_: Don't try to import the parent of a namespace package in
-  declare_namespace
-* `Distribute #196 `_: Tolerate responses with multiple Content-Length headers
-* `Distribute #205 `_: Sandboxing doesn't preserve working_set. Leads to setup_requires
-  problems.
-
-------
-0.6.16
-------
-
-* Builds sdist gztar even on Windows (avoiding `Distribute #193 `_).
-* `Distribute #192 `_: Fixed metadata omitted on Windows when package_dir
-  specified with forward-slash.
-* `Distribute #195 `_: Cython build support.
-* `Distribute #200 `_: Issues with recognizing 64-bit packages on Windows.
-
-------
-0.6.15
-------
-
-* Fixed typo in bdist_egg
-* Several issues under Python 3 has been solved.
-* `Distribute #146 `_: Fixed missing DLL files after easy_install of windows exe package.
-
-------
-0.6.14
-------
-
-* `Distribute #170 `_: Fixed unittest failure. Thanks to Toshio.
-* `Distribute #171 `_: Fixed race condition in unittests cause deadlocks in test suite.
-* `Distribute #143 `_: Fixed a lookup issue with easy_install.
-  Thanks to David and Zooko.
-* `Distribute #174 `_: Fixed the edit mode when its used with setuptools itself
-
-------
-0.6.13
-------
-
-* `Distribute #160 `_: 2.7 gives ValueError("Invalid IPv6 URL")
-* `Distribute #150 `_: Fixed using ~/.local even in a --no-site-packages virtualenv
-* `Distribute #163 `_: scan index links before external links, and don't use the md5 when
-  comparing two distributions
-
-------
-0.6.12
-------
-
-* `Distribute #149 `_: Fixed various failures on 2.3/2.4
-
-------
-0.6.11
-------
-
-* Found another case of SandboxViolation - fixed
-* `Distribute #15 `_ and `Distribute #48 `_: Introduced a socket timeout of 15 seconds on url openings
-* Added indexsidebar.html into MANIFEST.in
-* `Distribute #108 `_: Fixed TypeError with Python3.1
-* `Distribute #121 `_: Fixed --help install command trying to actually install.
-* `Distribute #112 `_: Added an os.makedirs so that Tarek's solution will work.
-* `Distribute #133 `_: Added --no-find-links to easy_install
-* Added easy_install --user
-* `Distribute #100 `_: Fixed develop --user not taking '.' in PYTHONPATH into account
-* `Distribute #134 `_: removed spurious UserWarnings. Patch by VanLindberg
-* `Distribute #138 `_: cant_write_to_target error when setup_requires is used.
-* `Distribute #147 `_: respect the sys.dont_write_bytecode flag
-
-------
-0.6.10
-------
-
-* Reverted change made for the DistributionNotFound exception because
-  zc.buildout uses the exception message to get the name of the
-  distribution.
-
------
-0.6.9
------
-
-* `Distribute #90 `_: unknown setuptools version can be added in the working set
-* `Distribute #87 `_: setupt.py doesn't try to convert distribute_setup.py anymore
-  Initial Patch by arfrever.
-* `Distribute #89 `_: added a side bar with a download link to the doc.
-* `Distribute #86 `_: fixed missing sentence in pkg_resources doc.
-* Added a nicer error message when a DistributionNotFound is raised.
-* `Distribute #80 `_: test_develop now works with Python 3.1
-* `Distribute #93 `_: upload_docs now works if there is an empty sub-directory.
-* `Distribute #70 `_: exec bit on non-exec files
-* `Distribute #99 `_: now the standalone easy_install command doesn't uses a
-  "setup.cfg" if any exists in the working directory. It will use it
-  only if triggered by ``install_requires`` from a setup.py call
-  (install, develop, etc).
-* `Distribute #101 `_: Allowing ``os.devnull`` in Sandbox
-* `Distribute #92 `_: Fixed the "no eggs" found error with MacPort
-  (platform.mac_ver() fails)
-* `Distribute #103 `_: test_get_script_header_jython_workaround not run
-  anymore under py3 with C or POSIX local. Contributed by Arfrever.
-* `Distribute #104 `_: remvoved the assertion when the installation fails,
-  with a nicer message for the end user.
-* `Distribute #100 `_: making sure there's no SandboxViolation when
-  the setup script patches setuptools.
-
------
-0.6.8
------
-
-* Added "check_packages" in dist. (added in Setuptools 0.6c11)
-* Fixed the DONT_PATCH_SETUPTOOLS state.
-
------
-0.6.7
------
-
-* `Distribute #58 `_: Added --user support to the develop command
-* `Distribute #11 `_: Generated scripts now wrap their call to the script entry point
-  in the standard "if name == 'main'"
-* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
-  can drive an installation that doesn't patch a global setuptools.
-* Reviewed unladen-swallow specific change from
-  http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
-  and determined that it no longer applies. Distribute should work fine with
-  Unladen Swallow 2009Q3.
-* `Distribute #21 `_: Allow PackageIndex.open_url to gracefully handle all cases of a
-  httplib.HTTPException instead of just InvalidURL and BadStatusLine.
-* Removed virtual-python.py from this distribution and updated documentation
-  to point to the actively maintained virtualenv instead.
-* `Distribute #64 `_: use_setuptools no longer rebuilds the distribute egg every
-  time it is run
-* use_setuptools now properly respects the requested version
-* use_setuptools will no longer try to import a distribute egg for the
-  wrong Python version
-* `Distribute #74 `_: no_fake should be True by default.
-* `Distribute #72 `_: avoid a bootstrapping issue with easy_install -U
-
------
-0.6.6
------
-
-* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
-  (patch by Holger Krekel)
-
------
-0.6.5
------
-
-* `Distribute #65 `_: cli.exe and gui.exe are now generated at build time,
-  depending on the platform in use.
-
-* `Distribute #67 `_: Fixed doc typo (PEP 381/382)
-
-* Distribute no longer shadows setuptools if we require a 0.7-series
-  setuptools.  And an error is raised when installing a 0.7 setuptools with
-  distribute.
-
-* When run from within buildout, no attempt is made to modify an existing
-  setuptools egg, whether in a shared egg directory or a system setuptools.
-
-* Fixed a hole in sandboxing allowing builtin file to write outside of
-  the sandbox.
-
------
-0.6.4
------
-
-* Added the generation of `distribute_setup_3k.py` during the release.
-  This closes `Distribute #52 `_.
-
-* Added an upload_docs command to easily upload project documentation to
-  PyPI's https://pythonhosted.org. This close issue `Distribute #56 `_.
-
-* Fixed a bootstrap bug on the use_setuptools() API.
-
------
-0.6.3
------
-
-setuptools
-==========
-
-* Fixed a bunch of calls to file() that caused crashes on Python 3.
-
-bootstrapping
-=============
-
-* Fixed a bug in sorting that caused bootstrap to fail on Python 3.
-
------
-0.6.2
------
-
-setuptools
-==========
-
-* Added Python 3 support; see docs/python3.txt.
-  This closes `Old Setuptools #39 `_.
-
-* Added option to run 2to3 automatically when installing on Python 3.
-  This closes issue `Distribute #31 `_.
-
-* Fixed invalid usage of requirement.parse, that broke develop -d.
-  This closes `Old Setuptools #44 `_.
-
-* Fixed script launcher for 64-bit Windows.
-  This closes `Old Setuptools #2 `_.
-
-* KeyError when compiling extensions.
-  This closes `Old Setuptools #41 `_.
-
-bootstrapping
-=============
-
-* Fixed bootstrap not working on Windows. This closes issue `Distribute #49 `_.
-
-* Fixed 2.6 dependencies. This closes issue `Distribute #50 `_.
-
-* Make sure setuptools is patched when running through easy_install
-  This closes `Old Setuptools #40 `_.
-
------
-0.6.1
------
-
-setuptools
-==========
-
-* package_index.urlopen now catches BadStatusLine and malformed url errors.
-  This closes `Distribute #16 `_ and `Distribute #18 `_.
-
-* zip_ok is now False by default. This closes `Old Setuptools #33 `_.
-
-* Fixed invalid URL error catching. `Old Setuptools #20 `_.
-
-* Fixed invalid bootstraping with easy_install installation (`Distribute #40 `_).
-  Thanks to Florian Schulze for the help.
-
-* Removed buildout/bootstrap.py. A new repository will create a specific
-  bootstrap.py script.
-
-
-bootstrapping
-=============
-
-* The boostrap process leave setuptools alone if detected in the system
-  and --root or --prefix is provided, but is not in the same location.
-  This closes `Distribute #10 `_.
-
----
-0.6
----
-
-setuptools
-==========
-
-* Packages required at build time where not fully present at install time.
-  This closes `Distribute #12 `_.
-
-* Protected against failures in tarfile extraction. This closes `Distribute #10 `_.
-
-* Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 `_.
-
-* sandbox.py replaced builtin type file with builtin function open. This
-  closes `Distribute #6 `_.
-
-* Immediately close all file handles. This closes `Distribute #3 `_.
-
-* Added compatibility with Subversion 1.6. This references `Distribute #1 `_.
-
-pkg_resources
-=============
-
-* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
-  instead. Based on a patch from ronaldoussoren. This closes issue `#5 `_.
-
-* Fixed a SandboxViolation for mkdir that could occur in certain cases.
-  This closes `Distribute #13 `_.
-
-* Allow to find_on_path on systems with tight permissions to fail gracefully.
-  This closes `Distribute #9 `_.
-
-* Corrected inconsistency between documentation and code of add_entry.
-  This closes `Distribute #8 `_.
-
-* Immediately close all file handles. This closes `Distribute #3 `_.
-
-easy_install
-============
-
-* Immediately close all file handles. This closes `Distribute #3 `_.
-
------
-0.6c9
------
-
- * Fixed a missing files problem when using Windows source distributions on
-   non-Windows platforms, due to distutils not handling manifest file line
-   endings correctly.
-
- * Updated Pyrex support to work with Pyrex 0.9.6 and higher.
-
- * Minor changes for Jython compatibility, including skipping tests that can't
-   work on Jython.
-
- * Fixed not installing eggs in ``install_requires`` if they were also used for
-   ``setup_requires`` or ``tests_require``.
-
- * Fixed not fetching eggs in ``install_requires`` when running tests.
-
- * Allow ``ez_setup.use_setuptools()`` to upgrade existing setuptools
-   installations when called from a standalone ``setup.py``.
-
- * Added a warning if a namespace package is declared, but its parent package
-   is not also declared as a namespace.
-
- * Support Subversion 1.5
-
- * Removed use of deprecated ``md5`` module if ``hashlib`` is available
-
- * Fixed ``bdist_wininst upload`` trying to upload the ``.exe`` twice
-
- * Fixed ``bdist_egg`` putting a ``native_libs.txt`` in the source package's
-   ``.egg-info``, when it should only be in the built egg's ``EGG-INFO``.
-
- * Ensure that _full_name is set on all shared libs before extensions are
-   checked for shared lib usage.  (Fixes a bug in the experimental shared
-   library build support.)
-
- * Fix to allow unpacked eggs containing native libraries to fail more
-   gracefully under Google App Engine (with an ``ImportError`` loading the
-   C-based module, instead of getting a ``NameError``).
-
------
-0.6c7
------
-
- * Fixed ``distutils.filelist.findall()`` crashing on broken symlinks, and
-   ``egg_info`` command failing on new, uncommitted SVN directories.
-
- * Fix import problems with nested namespace packages installed via
-   ``--root`` or ``--single-version-externally-managed``, due to the
-   parent package not having the child package as an attribute.
-
------
-0.6c6
------
-
- * Added ``--egg-path`` option to ``develop`` command, allowing you to force
-   ``.egg-link`` files to use relative paths (allowing them to be shared across
-   platforms on a networked drive).
-
- * Fix not building binary RPMs correctly.
-
- * Fix "eggsecutables" (such as setuptools' own egg) only being runnable with
-   bash-compatible shells.
-
- * Fix ``#!`` parsing problems in Windows ``.exe`` script wrappers, when there
-   was whitespace inside a quoted argument or at the end of the ``#!`` line
-   (a regression introduced in 0.6c4).
-
- * Fix ``test`` command possibly failing if an older version of the project
-   being tested was installed on ``sys.path`` ahead of the test source
-   directory.
-
- * Fix ``find_packages()`` treating ``ez_setup`` and directories with ``.`` in
-   their names as packages.
-
------
-0.6c5
------
-
- * Fix uploaded ``bdist_rpm`` packages being described as ``bdist_egg``
-   packages under Python versions less than 2.5.
-
- * Fix uploaded ``bdist_wininst`` packages being described as suitable for
-   "any" version by Python 2.5, even if a ``--target-version`` was specified.
-
------
-0.6c4
------
-
- * Overhauled Windows script wrapping to support ``bdist_wininst`` better.
-   Scripts installed with ``bdist_wininst`` will always use ``#!python.exe`` or
-   ``#!pythonw.exe`` as the executable name (even when built on non-Windows
-   platforms!), and the wrappers will look for the executable in the script's
-   parent directory (which should find the right version of Python).
-
- * Fix ``upload`` command not uploading files built by ``bdist_rpm`` or
-   ``bdist_wininst`` under Python 2.3 and 2.4.
-
- * Add support for "eggsecutable" headers: a ``#!/bin/sh`` script that is
-   prepended to an ``.egg`` file to allow it to be run as a script on Unix-ish
-   platforms.  (This is mainly so that setuptools itself can have a single-file
-   installer on Unix, without doing multiple downloads, dealing with firewalls,
-   etc.)
-
- * Fix problem with empty revision numbers in Subversion 1.4 ``entries`` files
-
- * Use cross-platform relative paths in ``easy-install.pth`` when doing
-   ``develop`` and the source directory is a subdirectory of the installation
-   target directory.
-
- * Fix a problem installing eggs with a system packaging tool if the project
-   contained an implicit namespace package; for example if the ``setup()``
-   listed a namespace package ``foo.bar`` without explicitly listing ``foo``
-   as a namespace package.
-
------
-0.6c3
------
-
- * Fixed breakages caused by Subversion 1.4's new "working copy" format
-
------
-0.6c2
------
-
- * The ``ez_setup`` module displays the conflicting version of setuptools (and
-   its installation location) when a script requests a version that's not
-   available.
-
- * Running ``setup.py develop`` on a setuptools-using project will now install
-   setuptools if needed, instead of only downloading the egg.
-
------
-0.6c1
------
-
- * Fixed ``AttributeError`` when trying to download a ``setup_requires``
-   dependency when a distribution lacks a ``dependency_links`` setting.
-
- * Made ``zip-safe`` and ``not-zip-safe`` flag files contain a single byte, so
-   as to play better with packaging tools that complain about zero-length
-   files.
-
- * Made ``setup.py develop`` respect the ``--no-deps`` option, which it
-   previously was ignoring.
-
- * Support ``extra_path`` option to ``setup()`` when ``install`` is run in
-   backward-compatibility mode.
-
- * Source distributions now always include a ``setup.cfg`` file that explicitly
-   sets ``egg_info`` options such that they produce an identical version number
-   to the source distribution's version number.  (Previously, the default
-   version number could be different due to the use of ``--tag-date``, or if
-   the version was overridden on the command line that built the source
-   distribution.)
-
------
-0.6b4
------
-
- * Fix ``register`` not obeying name/version set by ``egg_info`` command, if
-   ``egg_info`` wasn't explicitly run first on the same command line.
-
- * Added ``--no-date`` and ``--no-svn-revision`` options to ``egg_info``
-   command, to allow suppressing tags configured in ``setup.cfg``.
-
- * Fixed redundant warnings about missing ``README`` file(s); it should now
-   appear only if you are actually a source distribution.
-
------
-0.6b3
------
-
- * Fix ``bdist_egg`` not including files in subdirectories of ``.egg-info``.
-
- * Allow ``.py`` files found by the ``include_package_data`` option to be
-   automatically included.  Remove duplicate data file matches if both
-   ``include_package_data`` and ``package_data`` are used to refer to the same
-   files.
-
------
-0.6b1
------
-
- * Strip ``module`` from the end of compiled extension modules when computing
-   the name of a ``.py`` loader/wrapper.  (Python's import machinery ignores
-   this suffix when searching for an extension module.)
-
-------
-0.6a11
-------
-
- * Added ``test_loader`` keyword to support custom test loaders
-
- * Added ``setuptools.file_finders`` entry point group to allow implementing
-   revision control plugins.
-
- * Added ``--identity`` option to ``upload`` command.
-
- * Added ``dependency_links`` to allow specifying URLs for ``--find-links``.
-
- * Enhanced test loader to scan packages as well as modules, and call
-   ``additional_tests()`` if present to get non-unittest tests.
-
- * Support namespace packages in conjunction with system packagers, by omitting
-   the installation of any ``__init__.py`` files for namespace packages, and
-   adding a special ``.pth`` file to create a working package in
-   ``sys.modules``.
-
- * Made ``--single-version-externally-managed`` automatic when ``--root`` is
-   used, so that most system packagers won't require special support for
-   setuptools.
-
- * Fixed ``setup_requires``, ``tests_require``, etc. not using ``setup.cfg`` or
-   other configuration files for their option defaults when installing, and
-   also made the install use ``--multi-version`` mode so that the project
-   directory doesn't need to support .pth files.
-
- * ``MANIFEST.in`` is now forcibly closed when any errors occur while reading
-   it.  Previously, the file could be left open and the actual error would be
-   masked by problems trying to remove the open file on Windows systems.
-
-------
-0.6a10
-------
-
- * Fixed the ``develop`` command ignoring ``--find-links``.
-
------
-0.6a9
------
-
- * The ``sdist`` command no longer uses the traditional ``MANIFEST`` file to
-   create source distributions.  ``MANIFEST.in`` is still read and processed,
-   as are the standard defaults and pruning.  But the manifest is built inside
-   the project's ``.egg-info`` directory as ``SOURCES.txt``, and it is rebuilt
-   every time the ``egg_info`` command is run.
-
- * Added the ``include_package_data`` keyword to ``setup()``, allowing you to
-   automatically include any package data listed in revision control or
-   ``MANIFEST.in``
-
- * Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to
-   trim back files included via the ``package_data`` and
-   ``include_package_data`` options.
-
- * Fixed ``--tag-svn-revision`` not working when run from a source
-   distribution.
-
- * Added warning for namespace packages with missing ``declare_namespace()``
-
- * Added ``tests_require`` keyword to ``setup()``, so that e.g. packages
-   requiring ``nose`` to run unit tests can make this dependency optional
-   unless the ``test`` command is run.
-
- * Made all commands that use ``easy_install`` respect its configuration
-   options, as this was causing some problems with ``setup.py install``.
-
- * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so
-   that you can process a directory tree through a processing filter as if it
-   were a zipfile or tarfile.
-
- * Added an internal ``install_egg_info`` command to use as part of old-style
-   ``install`` operations, that installs an ``.egg-info`` directory with the
-   package.
-
- * Added a ``--single-version-externally-managed`` option to the ``install``
-   command so that you can more easily wrap a "flat" egg in a system package.
-
- * Enhanced ``bdist_rpm`` so that it installs single-version eggs that
-   don't rely on a ``.pth`` file.  The ``--no-egg`` option has been removed,
-   since all RPMs are now built in a more backwards-compatible format.
-
- * Support full roundtrip translation of eggs to and from ``bdist_wininst``
-   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
-   egg in an .exe that will safely install it as an egg (i.e., with metadata
-   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
-   back into an ``.egg`` file or directory and install it as such.
-
-
------
-0.6a8
------
-
- * Fixed some problems building extensions when Pyrex was installed, especially
-   with Python 2.4 and/or packages using SWIG.
-
- * Made ``develop`` command accept all the same options as ``easy_install``,
-   and use the ``easy_install`` command's configuration settings as defaults.
-
- * Made ``egg_info --tag-svn-revision`` fall back to extracting the revision
-   number from ``PKG-INFO`` in case it is being run on a source distribution of
-   a snapshot taken from a Subversion-based project.
-
- * Automatically detect ``.dll``, ``.so`` and ``.dylib`` files that are being
-   installed as data, adding them to ``native_libs.txt`` automatically.
-
- * Fixed some problems with fresh checkouts of projects that don't include
-   ``.egg-info/PKG-INFO`` under revision control and put the project's source
-   code directly in the project directory.  If such a package had any
-   requirements that get processed before the ``egg_info`` command can be run,
-   the setup scripts would fail with a "Missing 'Version:' header and/or
-   PKG-INFO file" error, because the egg runtime interpreted the unbuilt
-   metadata in a directory on ``sys.path`` (i.e. the current directory) as
-   being a corrupted egg.  Setuptools now monkeypatches the distribution
-   metadata cache to pretend that the egg has valid version information, until
-   it has a chance to make it actually be so (via the ``egg_info`` command).
-
------
-0.6a5
------
-
- * Fixed missing gui/cli .exe files in distribution.  Fixed bugs in tests.
-
------
-0.6a3
------
-
- * Added ``gui_scripts`` entry point group to allow installing GUI scripts
-   on Windows and other platforms.  (The special handling is only for Windows;
-   other platforms are treated the same as for ``console_scripts``.)
-
------
-0.6a2
------
-
- * Added ``console_scripts`` entry point group to allow installing scripts
-   without the need to create separate script files.  On Windows, console
-   scripts get an ``.exe`` wrapper so you can just type their name.  On other
-   platforms, the scripts are written without a file extension.
-
------
-0.6a1
------
-
- * Added support for building "old-style" RPMs that don't install an egg for
-   the target package, using a ``--no-egg`` option.
-
- * The ``build_ext`` command now works better when using the ``--inplace``
-   option and multiple Python versions.  It now makes sure that all extensions
-   match the current Python version, even if newer copies were built for a
-   different Python version.
-
- * The ``upload`` command no longer attaches an extra ``.zip`` when uploading
-   eggs, as PyPI now supports egg uploads without trickery.
-
- * The ``ez_setup`` script/module now displays a warning before downloading
-   the setuptools egg, and attempts to check the downloaded egg against an
-   internal MD5 checksum table.
-
- * Fixed the ``--tag-svn-revision`` option of ``egg_info`` not finding the
-   latest revision number; it was using the revision number of the directory
-   containing ``setup.py``, not the highest revision number in the project.
-
- * Added ``eager_resources`` setup argument
-
- * The ``sdist`` command now recognizes Subversion "deleted file" entries and
-   does not include them in source distributions.
-
- * ``setuptools`` now embeds itself more thoroughly into the distutils, so that
-   other distutils extensions (e.g. py2exe, py2app) will subclass setuptools'
-   versions of things, rather than the native distutils ones.
-
- * Added ``entry_points`` and ``setup_requires`` arguments to ``setup()``;
-   ``setup_requires`` allows you to automatically find and download packages
-   that are needed in order to *build* your project (as opposed to running it).
-
- * ``setuptools`` now finds its commands, ``setup()`` argument validators, and
-   metadata writers using entry points, so that they can be extended by
-   third-party packages.  See `Creating distutils Extensions
-   `_
-   for more details.
-
- * The vestigial ``depends`` command has been removed.  It was never finished
-   or documented, and never would have worked without EasyInstall - which it
-   pre-dated and was never compatible with.
-
-------
-0.5a12
-------
-
- * The zip-safety scanner now checks for modules that might be used with
-   ``python -m``, and marks them as unsafe for zipping, since Python 2.4 can't
-   handle ``-m`` on zipped modules.
-
-------
-0.5a11
-------
-
- * Fix breakage of the "develop" command that was caused by the addition of
-   ``--always-unzip`` to the ``easy_install`` command.
-
------
-0.5a9
------
-
- * Include ``svn:externals`` directories in source distributions as well as
-   normal subversion-controlled files and directories.
-
- * Added ``exclude=patternlist`` option to ``setuptools.find_packages()``
-
- * Changed --tag-svn-revision to include an "r" in front of the revision number
-   for better readability.
-
- * Added ability to build eggs without including source files (except for any
-   scripts, of course), using the ``--exclude-source-files`` option to
-   ``bdist_egg``.
-
- * ``setup.py install`` now automatically detects when an "unmanaged" package
-   or module is going to be on ``sys.path`` ahead of a package being installed,
-   thereby preventing the newer version from being imported.  If this occurs,
-   a warning message is output to ``sys.stderr``, but installation proceeds
-   anyway.  The warning message informs the user what files or directories
-   need deleting, and advises them they can also use EasyInstall (with the
-   ``--delete-conflicting`` option) to do it automatically.
-
- * The ``egg_info`` command now adds a ``top_level.txt`` file to the metadata
-   directory that lists all top-level modules and packages in the distribution.
-   This is used by the ``easy_install`` command to find possibly-conflicting
-   "unmanaged" packages when installing the distribution.
-
- * Added ``zip_safe`` and ``namespace_packages`` arguments to ``setup()``.
-   Added package analysis to determine zip-safety if the ``zip_safe`` flag
-   is not given, and advise the author regarding what code might need changing.
-
- * Fixed the swapped ``-d`` and ``-b`` options of ``bdist_egg``.
-
------
-0.5a8
------
-
- * The "egg_info" command now always sets the distribution metadata to "safe"
-   forms of the distribution name and version, so that distribution files will
-   be generated with parseable names (i.e., ones that don't include '-' in the
-   name or version).  Also, this means that if you use the various ``--tag``
-   options of "egg_info", any distributions generated will use the tags in the
-   version, not just egg distributions.
-
- * Added support for defining command aliases in distutils configuration files,
-   under the "[aliases]" section.  To prevent recursion and to allow aliases to
-   call the command of the same name, a given alias can be expanded only once
-   per command-line invocation.  You can define new aliases with the "alias"
-   command, either for the local, global, or per-user configuration.
-
- * Added "rotate" command to delete old distribution files, given a set of
-   patterns to match and the number of files to keep.  (Keeps the most
-   recently-modified distribution files matching each pattern.)
-
- * Added "saveopts" command that saves all command-line options for the current
-   invocation to the local, global, or per-user configuration file.  Useful for
-   setting defaults without having to hand-edit a configuration file.
-
- * Added a "setopt" command that sets a single option in a specified distutils
-   configuration file.
-
------
-0.5a7
------
-
- * Added "upload" support for egg and source distributions, including a bug
-   fix for "upload" and a temporary workaround for lack of .egg support in
-   PyPI.
-
------
-0.5a6
------
-
- * Beefed up the "sdist" command so that if you don't have a MANIFEST.in, it
-   will include all files under revision control (CVS or Subversion) in the
-   current directory, and it will regenerate the list every time you create a
-   source distribution, not just when you tell it to.  This should make the
-   default "do what you mean" more often than the distutils' default behavior
-   did, while still retaining the old behavior in the presence of MANIFEST.in.
-
- * Fixed the "develop" command always updating .pth files, even if you
-   specified ``-n`` or ``--dry-run``.
-
- * Slightly changed the format of the generated version when you use
-   ``--tag-build`` on the "egg_info" command, so that you can make tagged
-   revisions compare *lower* than the version specified in setup.py (e.g. by
-   using ``--tag-build=dev``).
-
------
-0.5a5
------
-
- * Added ``develop`` command to ``setuptools``-based packages.  This command
-   installs an ``.egg-link`` pointing to the package's source directory, and
-   script wrappers that ``execfile()`` the source versions of the package's
-   scripts.  This lets you put your development checkout(s) on sys.path without
-   having to actually install them.  (To uninstall the link, use
-   use ``setup.py develop --uninstall``.)
-
- * Added ``egg_info`` command to ``setuptools``-based packages.  This command
-   just creates or updates the "projectname.egg-info" directory, without
-   building an egg.  (It's used by the ``bdist_egg``, ``test``, and ``develop``
-   commands.)
-
- * Enhanced the ``test`` command so that it doesn't install the package, but
-   instead builds any C extensions in-place, updates the ``.egg-info``
-   metadata, adds the source directory to ``sys.path``, and runs the tests
-   directly on the source.  This avoids an "unmanaged" installation of the
-   package to ``site-packages`` or elsewhere.
-
- * Made ``easy_install`` a standard ``setuptools`` command, moving it from
-   the ``easy_install`` module to ``setuptools.command.easy_install``.  Note
-   that if you were importing or extending it, you must now change your imports
-   accordingly.  ``easy_install.py`` is still installed as a script, but not as
-   a module.
-
------
-0.5a4
------
-
- * Setup scripts using setuptools can now list their dependencies directly in
-   the setup.py file, without having to manually create a ``depends.txt`` file.
-   The ``install_requires`` and ``extras_require`` arguments to ``setup()``
-   are used to create a dependencies file automatically.  If you are manually
-   creating ``depends.txt`` right now, please switch to using these setup
-   arguments as soon as practical, because ``depends.txt`` support will be
-   removed in the 0.6 release cycle.  For documentation on the new arguments,
-   see the ``setuptools.dist.Distribution`` class.
-
- * Setup scripts using setuptools now always install using ``easy_install``
-   internally, for ease of uninstallation and upgrading.
-
------
-0.5a1
------
-
- * Added support for "self-installation" bootstrapping.  Packages can now
-   include ``ez_setup.py`` in their source distribution, and add the following
-   to their ``setup.py``, in order to automatically bootstrap installation of
-   setuptools as part of their setup process::
-
-    from ez_setup import use_setuptools
-    use_setuptools()
-
-    from setuptools import setup
-    # etc...
-
------
-0.4a2
------
-
- * Added ``ez_setup.py`` installer/bootstrap script to make initial setuptools
-   installation easier, and to allow distributions using setuptools to avoid
-   having to include setuptools in their source distribution.
-
- * All downloads are now managed by the ``PackageIndex`` class (which is now
-   subclassable and replaceable), so that embedders can more easily override
-   download logic, give download progress reports, etc.  The class has also
-   been moved to the new ``setuptools.package_index`` module.
-
- * The ``Installer`` class no longer handles downloading, manages a temporary
-   directory, or tracks the ``zip_ok`` option.  Downloading is now handled
-   by ``PackageIndex``, and ``Installer`` has become an ``easy_install``
-   command class based on ``setuptools.Command``.
-
- * There is a new ``setuptools.sandbox.run_setup()`` API to invoke a setup
-   script in a directory sandbox, and a new ``setuptools.archive_util`` module
-   with an ``unpack_archive()`` API.  These were split out of EasyInstall to
-   allow reuse by other tools and applications.
-
- * ``setuptools.Command`` now supports reinitializing commands using keyword
-   arguments to set/reset options.  Also, ``Command`` subclasses can now set
-   their ``command_consumes_arguments`` attribute to ``True`` in order to
-   receive an ``args`` option containing the rest of the command line.
-
------
-0.3a2
------
-
- * Added new options to ``bdist_egg`` to allow tagging the egg's version number
-   with a subversion revision number, the current date, or an explicit tag
-   value.  Run ``setup.py bdist_egg --help`` to get more information.
-
- * Misc. bug fixes
-
------
-0.3a1
------
-
- * Initial release.
-
-
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/METADATA b/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/METADATA
deleted file mode 100644
index 91b42d0..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/METADATA
+++ /dev/null
@@ -1,2142 +0,0 @@
-Metadata-Version: 2.0
-Name: setuptools
-Version: 6.0.2
-Summary: Easily download, build, install, upgrade, and uninstall Python packages
-Home-page: https://bitbucket.org/pypa/setuptools
-Author: Python Packaging Authority
-Author-email: distutils-sig@python.org
-License: PSF or ZPL
-Keywords: CPAN PyPI distutils eggs package management
-Platform: UNKNOWN
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: Python Software Foundation License
-Classifier: License :: OSI Approved :: Zope Public License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.6
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.1
-Classifier: Programming Language :: Python :: 3.2
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: System :: Archiving :: Packaging
-Classifier: Topic :: System :: Systems Administration
-Classifier: Topic :: Utilities
-Provides-Extra: certs
-Requires-Dist: certifi (==1.0.1); extra == 'certs'
-Provides-Extra: ssl
-Requires-Dist: wincertstore (==0.2); sys_platform=='win32' and extra == 'ssl'
-
-===============================
-Installing and Using Setuptools
-===============================
-
-.. contents:: **Table of Contents**
-
-
--------------------------
-Installation Instructions
--------------------------
-
-The recommended way to bootstrap setuptools on any system is to download
-`ez_setup.py`_ and run it using the target Python environment. Different
-operating systems have different recommended techniques to accomplish this
-basic routine, so below are some examples to get you started.
-
-Setuptools requires Python 2.6 or later. To install setuptools
-on Python 2.4 or Python 2.5, use the `bootstrap script for Setuptools 1.x
-`_.
-
-The link provided to ez_setup.py is a bookmark to bootstrap script for the
-latest known stable release.
-
-.. _ez_setup.py: https://bootstrap.pypa.io/ez_setup.py
-
-Windows (Powershell 3 or later)
-===============================
-
-For best results, uninstall previous versions FIRST (see `Uninstalling`_).
-
-Using Windows 8 (which includes PowerShell 3) or earlier versions of Windows
-with PowerShell 3 installed, it's possible to install with one simple
-Powershell command. Start up Powershell and paste this command::
-
-    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python -
-
-You must start the Powershell with Administrative privileges or you may choose
-to install a user-local installation::
-
-    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | python - --user
-
-If you have Python 3.3 or later, you can use the ``py`` command to install to
-different Python versions. For example, to install to Python 3.3 if you have
-Python 2.7 installed::
-
-    > (Invoke-WebRequest https://bootstrap.pypa.io/ez_setup.py).Content | py -3 -
-
-The recommended way to install setuptools on Windows is to download
-`ez_setup.py`_ and run it. The script will download the appropriate
-distribution file and install it for you.
-
-Once installation is complete, you will find an ``easy_install`` program in
-your Python ``Scripts`` subdirectory.  For simple invocation and best results,
-add this directory to your ``PATH`` environment variable, if it is not already
-present. If you did a user-local install, the ``Scripts`` subdirectory is
-``$env:APPDATA\Python\Scripts``.
-
-
-Windows (simplified)
-====================
-
-For Windows without PowerShell 3 or for installation without a command-line,
-download `ez_setup.py`_ using your preferred web browser or other technique
-and "run" that file.
-
-
-Unix (wget)
-===========
-
-Most Linux distributions come with wget.
-
-Download `ez_setup.py`_ and run it using the target Python version. The script
-will download the appropriate version and install it for you::
-
-    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python
-
-Note that you will may need to invoke the command with superuser privileges to
-install to the system Python::
-
-    > wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
-
-Alternatively, Setuptools may be installed to a user-local path::
-
-    > wget https://bootstrap.pypa.io/ez_setup.py -O - | python - --user
-
-Unix including Mac OS X (curl)
-==============================
-
-If your system has curl installed, follow the ``wget`` instructions but
-replace ``wget`` with ``curl`` and ``-O`` with ``-o``. For example::
-
-    > curl https://bootstrap.pypa.io/ez_setup.py -o - | python
-
-
-Advanced Installation
-=====================
-
-For more advanced installation options, such as installing to custom
-locations or prefixes, download and extract the source
-tarball from `Setuptools on PyPI `_
-and run setup.py with any supported distutils and Setuptools options.
-For example::
-
-    setuptools-x.x$ python setup.py install --prefix=/opt/setuptools
-
-Use ``--help`` to get a full options list, but we recommend consulting
-the `EasyInstall manual`_ for detailed instructions, especially `the section
-on custom installation locations`_.
-
-.. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall
-.. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations
-
-
-Downloads
-=========
-
-All setuptools downloads can be found at `the project's home page in the Python
-Package Index`_.  Scroll to the very bottom of the page to find the links.
-
-.. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools
-
-In addition to the PyPI downloads, the development version of ``setuptools``
-is available from the `Bitbucket repo`_, and in-development versions of the
-`0.6 branch`_ are available as well.
-
-.. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev
-.. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06
-
-Uninstalling
-============
-
-On Windows, if Setuptools was installed using an ``.exe`` or ``.msi``
-installer, simply use the uninstall feature of "Add/Remove Programs" in the
-Control Panel.
-
-Otherwise, to uninstall Setuptools or Distribute, regardless of the Python
-version, delete all ``setuptools*`` and ``distribute*`` files and
-directories from your system's ``site-packages`` directory
-(and any other ``sys.path`` directories) FIRST.
-
-If you are upgrading or otherwise plan to re-install Setuptools or Distribute,
-nothing further needs to be done. If you want to completely remove Setuptools,
-you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts
-and associated executables installed to the Python scripts directory.
-
---------------------------------
-Using Setuptools and EasyInstall
---------------------------------
-
-Here are some of the available manuals, tutorials, and other resources for
-learning about Setuptools, Python Eggs, and EasyInstall:
-
-* `The EasyInstall user's guide and reference manual`_
-* `The setuptools Developer's Guide`_
-* `The pkg_resources API reference`_
-* `Package Compatibility Notes`_ (user-maintained)
-* `The Internal Structure of Python Eggs`_
-
-Questions, comments, and bug reports should be directed to the `distutils-sig
-mailing list`_.  If you have written (or know of) any tutorials, documentation,
-plug-ins, or other resources for setuptools users, please let us know about
-them there, so this reference list can be updated.  If you have working,
-*tested* patches to correct problems or add features, you may submit them to
-the `setuptools bug tracker`_.
-
-.. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues
-.. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes
-.. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html
-.. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html
-.. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html
-.. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html
-.. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/
-
-
--------
-Credits
--------
-
-* The original design for the ``.egg`` format and the ``pkg_resources`` API was
-  co-created by Phillip Eby and Bob Ippolito.  Bob also implemented the first
-  version of ``pkg_resources``, and supplied the OS X operating system version
-  compatibility algorithm.
-
-* Ian Bicking implemented many early "creature comfort" features of
-  easy_install, including support for downloading via Sourceforge and
-  Subversion repositories.  Ian's comments on the Web-SIG about WSGI
-  application deployment also inspired the concept of "entry points" in eggs,
-  and he has given talks at PyCon and elsewhere to inform and educate the
-  community about eggs and setuptools.
-
-* Jim Fulton contributed time and effort to build automated tests of various
-  aspects of ``easy_install``, and supplied the doctests for the command-line
-  ``.exe`` wrappers on Windows.
-
-* Phillip J. Eby is the seminal author of setuptools, and
-  first proposed the idea of an importable binary distribution format for
-  Python application plug-ins.
-
-* Significant parts of the implementation of setuptools were funded by the Open
-  Source Applications Foundation, to provide a plug-in infrastructure for the
-  Chandler PIM application.  In addition, many OSAF staffers (such as Mike
-  "Code Bear" Taylor) contributed their time and stress as guinea pigs for the
-  use of eggs and setuptools, even before eggs were "cool".  (Thanks, guys!)
-
-* Tarek Ziadé is the principal author of the Distribute fork, which
-  re-invigorated the community on the project, encouraged renewed innovation,
-  and addressed many defects.
-
-* Since the merge with Distribute, Jason R. Coombs is the
-  maintainer of setuptools.  The project is maintained in coordination with
-  the Python Packaging Authority (PyPA) and the larger Python community.
-
-.. _files:
-
-=======
-CHANGES
-=======
-
------
-6.0.2
------
-
-* `Issue #262 `_: Fixed regression in pip install due to egg-info directories
-  being omitted. Re-opens `Issue #118 `_.
-
------
-6.0.1
------
-
-* `Issue #259 `_: Fixed regression with namespace package handling on ``single
-  version, externally managed`` installs.
-
----
-6.0
----
-
-* `Issue #100 `_: When building a distribution, Setuptools will no longer match
-  default files using platform-dependent case sensitivity, but rather will
-  only match the files if their case matches exactly. As a result, on Windows
-  and other case-insensitive file systems, files with names such as
-  'readme.txt' or 'README.TXT' will be omitted from the distribution and a
-  warning will be issued indicating that 'README.txt' was not found. Other
-  filenames affected are:
-
-    - README.rst
-    - README
-    - setup.cfg
-    - setup.py (or the script name)
-    - test/test*.py
-
-  Any users producing distributions with filenames that match those above
-  case-insensitively, but not case-sensitively, should rename those files in
-  their repository for better portability.
-* `Pull Request #72 `_: When using ``single_version_externally_managed``, the
-  exclusion list now includes Python 3.2 ``__pycache__`` entries.
-* `Pull Request #76 `_ and `Pull Request #78 `_: lines in top_level.txt are now
-  ordered deterministically.
-* `Issue #118 `_: The egg-info directory is now no longer included in the list
-  of outputs.
-* `Issue #258 `_: Setuptools now patches distutils msvc9compiler to
-  recognize the specially-packaged compiler package for easy extension module
-  support on Python 2.6, 2.7, and 3.2.
-
----
-5.8
----
-
-* `Issue #237 `_: ``pkg_resources`` now uses explicit detection of Python 2 vs.
-  Python 3, supporting environments where builtins have been patched to make
-  Python 3 look more like Python 2.
-
----
-5.7
----
-
-* `Issue #240 `_: Based on real-world performance measures against 5.4, zip
-  manifests are now cached in all circumstances. The
-  ``PKG_RESOURCES_CACHE_ZIP_MANIFESTS`` environment variable is no longer
-  relevant. The observed "memory increase" referenced in the 5.4 release
-  notes and detailed in `Issue #154 `_ was likely not an increase over the status
-  quo, but rather only an increase over not storing the zip info at all.
-
----
-5.6
----
-
-* `Issue #242 `_: Use absolute imports in svn_utils to avoid issues if the
-  installing package adds an xml module to the path.
-
------
-5.5.1
------
-
-* `Issue #239 `_: Fix typo in 5.5 such that fix did not take.
-
----
-5.5
----
-
-* `Issue #239 `_: Setuptools now includes the setup_requires directive on
-  Distribution objects and validates the syntax just like install_requires
-  and tests_require directives.
-
------
-5.4.2
------
-
-* `Issue #236 `_: Corrected regression in execfile implementation for Python 2.6.
-
------
-5.4.1
------
-
-* `Python #7776 `_: (ssl_support) Correct usage of host for validation when
-  tunneling for HTTPS.
-
----
-5.4
----
-
-* `Issue #154 `_: ``pkg_resources`` will now cache the zip manifests rather than
-  re-processing the same file from disk multiple times, but only if the
-  environment variable ``PKG_RESOURCES_CACHE_ZIP_MANIFESTS`` is set. Clients
-  that package many modules in the same zip file will see some improvement
-  in startup time by enabling this feature. This feature is not enabled by
-  default because it causes a substantial increase in memory usage.
-
----
-5.3
----
-
-* `Issue #185 `_: Make svn tagging work on the new style SVN metadata.
-  Thanks cazabon!
-* Prune revision control directories (e.g .svn) from base path
-  as well as sub-directories.
-
----
-5.2
----
-
-* Added a `Developer Guide
-  `_ to the official
-  documentation.
-* Some code refactoring and cleanup was done with no intended behavioral
-  changes.
-* During install_egg_info, the generated lines for namespace package .pth
-  files are now processed even during a dry run.
-
----
-5.1
----
-
-* `Issue #202 `_: Implemented more robust cache invalidation for the ZipImporter,
-  building on the work in `Issue #168 `_. Special thanks to Jurko Gospodnetic and
-  PJE.
-
------
-5.0.2
------
-
-* `Issue #220 `_: Restored script templates.
-
------
-5.0.1
------
-
-* Renamed script templates to end with .tmpl now that they no longer need
-  to be processed by 2to3. Fixes spurious syntax errors during build/install.
-
----
-5.0
----
-
-* `Issue #218 `_: Re-release of 3.8.1 to signal that it supersedes 4.x.
-* Incidentally, script templates were updated not to include the triple-quote
-  escaping.
-
--------------------------
-3.7.1 and 3.8.1 and 4.0.1
--------------------------
-
-* `Issue #213 `_: Use legacy StringIO behavior for compatibility under pbr.
-* `Issue #218 `_: Setuptools 3.8.1 superseded 4.0.1, and 4.x was removed
-  from the available versions to install.
-
----
-4.0
----
-
-* `Issue #210 `_: ``setup.py develop`` now copies scripts in binary mode rather
-  than text mode, matching the behavior of the ``install`` command.
-
----
-3.8
----
-
-* Extend `Issue #197 `_ workaround to include all Python 3 versions prior to
-  3.2.2.
-
----
-3.7
----
-
-* `Issue #193 `_: Improved handling of Unicode filenames when building manifests.
-
----
-3.6
----
-
-* `Issue #203 `_: Honor proxy settings for Powershell downloader in the bootstrap
-  routine.
-
------
-3.5.2
------
-
-* `Issue #168 `_: More robust handling of replaced zip files and stale caches.
-  Fixes ZipImportError complaining about a 'bad local header'.
-
------
-3.5.1
------
-
-* `Issue #199 `_: Restored ``install._install`` for compatibility with earlier
-  NumPy versions.
-
----
-3.5
----
-
-* `Issue #195 `_: Follow symbolic links in find_packages (restoring behavior
-  broken in 3.4).
-* `Issue #197 `_: On Python 3.1, PKG-INFO is now saved in a UTF-8 encoding instead
-  of ``sys.getpreferredencoding`` to match the behavior on Python 2.6-3.4.
-* `Issue #192 `_: Preferred bootstrap location is now
-  https://bootstrap.pypa.io/ez_setup.py (mirrored from former location).
-
------
-3.4.4
------
-
-* `Issue #184 `_: Correct failure where find_package over-matched packages
-  when directory traversal isn't short-circuited.
-
------
-3.4.3
------
-
-* `Issue #183 `_: Really fix test command with Python 3.1.
-
------
-3.4.2
------
-
-* `Issue #183 `_: Fix additional regression in test command on Python 3.1.
-
------
-3.4.1
------
-
-* `Issue #180 `_: Fix regression in test command not caught by py.test-run tests.
-
----
-3.4
----
-
-* `Issue #176 `_: Add parameter to the test command to support a custom test
-  runner: --test-runner or -r.
-* `Issue #177 `_: Now assume most common invocation to install command on
-  platforms/environments without stack support (issuing a warning). Setuptools
-  now installs naturally on IronPython. Behavior on CPython should be
-  unchanged.
-
----
-3.3
----
-
-* Add ``include`` parameter to ``setuptools.find_packages()``.
-
----
-3.2
----
-
-* `Pull Request #39 `_: Add support for C++ targets from Cython ``.pyx`` files.
-* `Issue #162 `_: Update dependency on certifi to 1.0.1.
-* `Issue #164 `_: Update dependency on wincertstore to 0.2.
-
----
-3.1
----
-
-* `Issue #161 `_: Restore Features functionality to allow backward compatibility
-  (for Features) until the uses of that functionality is sufficiently removed.
-
------
-3.0.2
------
-
-* Correct typo in previous bugfix.
-
------
-3.0.1
------
-
-* `Issue #157 `_: Restore support for Python 2.6 in bootstrap script where
-  ``zipfile.ZipFile`` does not yet have support for context managers.
-
----
-3.0
----
-
-* `Issue #125 `_: Prevent Subversion support from creating a ~/.subversion
-  directory just for checking the presence of a Subversion repository.
-* `Issue #12 `_: Namespace packages are now imported lazily.  That is, the mere
-  declaration of a namespace package in an egg on ``sys.path`` no longer
-  causes it to be imported when ``pkg_resources`` is imported.  Note that this
-  change means that all of a namespace package's ``__init__.py`` files must
-  include a ``declare_namespace()`` call in order to ensure that they will be
-  handled properly at runtime.  In 2.x it was possible to get away without
-  including the declaration, but only at the cost of forcing namespace
-  packages to be imported early, which 3.0 no longer does.
-* `Issue #148 `_: When building (bdist_egg), setuptools no longer adds
-  ``__init__.py`` files to namespace packages. Any packages that rely on this
-  behavior will need to create ``__init__.py`` files and include the
-  ``declare_namespace()``.
-* `Issue #7 `_: Setuptools itself is now distributed as a zip archive in addition to
-  tar archive. ez_setup.py now uses zip archive. This approach avoids the potential
-  security vulnerabilities presented by use of tar archives in ez_setup.py.
-  It also leverages the security features added to ZipFile.extract in Python 2.7.4.
-* `Issue #65 `_: Removed deprecated Features functionality.
-* `Pull Request #28 `_: Remove backport of ``_bytecode_filenames`` which is
-  available in Python 2.6 and later, but also has better compatibility with
-  Python 3 environments.
-* `Issue #156 `_: Fix spelling of __PYVENV_LAUNCHER__ variable.
-
----
-2.2
----
-
-* `Issue #141 `_: Restored fix for allowing setup_requires dependencies to
-  override installed dependencies during setup.
-* `Issue #128 `_: Fixed issue where only the first dependency link was honored
-  in a distribution where multiple dependency links were supplied.
-
------
-2.1.2
------
-
-* `Issue #144 `_: Read long_description using codecs module to avoid errors
-  installing on systems where LANG=C.
-
------
-2.1.1
------
-
-* `Issue #139 `_: Fix regression in re_finder for CVS repos (and maybe Git repos
-  as well).
-
----
-2.1
----
-
-* `Issue #129 `_: Suppress inspection of ``*.whl`` files when searching for files
-  in a zip-imported file.
-* `Issue #131 `_: Fix RuntimeError when constructing an egg fetcher.
-
------
-2.0.2
------
-
-* Fix NameError during installation with Python implementations (e.g. Jython)
-  not containing parser module.
-* Fix NameError in ``sdist:re_finder``.
-
------
-2.0.1
------
-
-* `Issue #124 `_: Fixed error in list detection in upload_docs.
-
----
-2.0
----
-
-* `Issue #121 `_: Exempt lib2to3 pickled grammars from DirectorySandbox.
-* `Issue #41 `_: Dropped support for Python 2.4 and Python 2.5. Clients requiring
-  setuptools for those versions of Python should use setuptools 1.x.
-* Removed ``setuptools.command.easy_install.HAS_USER_SITE``. Clients
-  expecting this boolean variable should use ``site.ENABLE_USER_SITE``
-  instead.
-* Removed ``pkg_resources.ImpWrapper``. Clients that expected this class
-  should use ``pkgutil.ImpImporter`` instead.
-
------
-1.4.2
------
-
-* `Issue #116 `_: Correct TypeError when reading a local package index on Python
-  3.
-
------
-1.4.1
------
-
-* `Issue #114 `_: Use ``sys.getfilesystemencoding`` for decoding config in
-  ``bdist_wininst`` distributions.
-
-* `Issue #105 `_ and `Issue #113 `_: Establish a more robust technique for
-  determining the terminal encoding::
-
-    1. Try ``getpreferredencoding``
-    2. If that returns US_ASCII or None, try the encoding from
-       ``getdefaultlocale``. If that encoding was a "fallback" because Python
-       could not figure it out from the environment or OS, encoding remains
-       unresolved.
-    3. If the encoding is resolved, then make sure Python actually implements
-       the encoding.
-    4. On the event of an error or unknown codec, revert to fallbacks
-       (UTF-8 on Darwin, ASCII on everything else).
-    5. On the encoding is 'mac-roman' on Darwin, use UTF-8 as 'mac-roman' was
-       a bug on older Python releases.
-
-    On a side note, it would seem that the encoding only matters for when SVN
-    does not yet support ``--xml`` and when getting repository and svn version
-    numbers. The ``--xml`` technique should yield UTF-8 according to some
-    messages on the SVN mailing lists. So if the version numbers are always
-    7-bit ASCII clean, it may be best to only support the file parsing methods
-    for legacy SVN releases and support for SVN without the subprocess command
-    would simple go away as support for the older SVNs does.
-
----
-1.4
----
-
-* `Issue #27 `_: ``easy_install`` will now use credentials from .pypirc if
-  present for connecting to the package index.
-* `Pull Request #21 `_: Omit unwanted newlines in ``package_index._encode_auth``
-  when the username/password pair length indicates wrapping.
-
------
-1.3.2
------
-
-* `Issue #99 `_: Fix filename encoding issues in SVN support.
-
------
-1.3.1
------
-
-* Remove exuberant warning in SVN support when SVN is not used.
-
----
-1.3
----
-
-* Address security vulnerability in SSL match_hostname check as reported in
-  `Python #17997 `_.
-* Prefer `backports.ssl_match_hostname
-  `_ for backport
-  implementation if present.
-* Correct NameError in ``ssl_support`` module (``socket.error``).
-
----
-1.2
----
-
-* `Issue #26 `_: Add support for SVN 1.7. Special thanks to Philip Thiem for the
-  contribution.
-* `Issue #93 `_: Wheels are now distributed with every release. Note that as
-  reported in `Issue #108 `_, as of Pip 1.4, scripts aren't installed properly
-  from wheels. Therefore, if using Pip to install setuptools from a wheel,
-  the ``easy_install`` command will not be available.
-* Setuptools "natural" launcher support, introduced in 1.0, is now officially
-  supported.
-
------
-1.1.7
------
-
-* Fixed behavior of NameError handling in 'script template (dev).py' (script
-  launcher for 'develop' installs).
-* ``ez_setup.py`` now ensures partial downloads are cleaned up following
-  a failed download.
-* `Distribute #363 `_ and `Issue #55 `_: Skip an sdist test that fails on locales
-  other than UTF-8.
-
------
-1.1.6
------
-
-* `Distribute #349 `_: ``sandbox.execfile`` now opens the target file in binary
-  mode, thus honoring a BOM in the file when compiled.
-
------
-1.1.5
------
-
-* `Issue #69 `_: Second attempt at fix (logic was reversed).
-
------
-1.1.4
------
-
-* `Issue #77 `_: Fix error in upload command (Python 2.4).
-
------
-1.1.3
------
-
-* Fix NameError in previous patch.
-
------
-1.1.2
------
-
-* `Issue #69 `_: Correct issue where 404 errors are returned for URLs with
-  fragments in them (such as #egg=).
-
------
-1.1.1
------
-
-* `Issue #75 `_: Add ``--insecure`` option to ez_setup.py to accommodate
-  environments where a trusted SSL connection cannot be validated.
-* `Issue #76 `_: Fix AttributeError in upload command with Python 2.4.
-
----
-1.1
----
-
-* `Issue #71 `_ (`Distribute #333 `_): EasyInstall now puts less emphasis on the
-  condition when a host is blocked via ``--allow-hosts``.
-* `Issue #72 `_: Restored Python 2.4 compatibility in ``ez_setup.py``.
-
----
-1.0
----
-
-* `Issue #60 `_: On Windows, Setuptools supports deferring to another launcher,
-  such as Vinay Sajip's `pylauncher `_
-  (included with Python 3.3) to launch console and GUI scripts and not install
-  its own launcher executables. This experimental functionality is currently
-  only enabled if  the ``SETUPTOOLS_LAUNCHER`` environment variable is set to
-  "natural". In the future, this behavior may become default, but only after
-  it has matured and seen substantial adoption. The ``SETUPTOOLS_LAUNCHER``
-  also accepts "executable" to force the default behavior of creating launcher
-  executables.
-* `Issue #63 `_: Bootstrap script (ez_setup.py) now prefers Powershell, curl, or
-  wget for retrieving the Setuptools tarball for improved security of the
-  install. The script will still fall back to a simple ``urlopen`` on
-  platforms that do not have these tools.
-* `Issue #65 `_: Deprecated the ``Features`` functionality.
-* `Issue #52 `_: In ``VerifyingHTTPSConn``, handle a tunnelled (proxied)
-  connection.
-
-Backward-Incompatible Changes
-=============================
-
-This release includes a couple of backward-incompatible changes, but most if
-not all users will find 1.0 a drop-in replacement for 0.9.
-
-* `Issue #50 `_: Normalized API of environment marker support. Specifically,
-  removed line number and filename from SyntaxErrors when returned from
-  `pkg_resources.invalid_marker`. Any clients depending on the specific
-  string representation of exceptions returned by that function may need to
-  be updated to account for this change.
-* `Issue #50 `_: SyntaxErrors generated by `pkg_resources.invalid_marker` are
-  normalized for cross-implementation consistency.
-* Removed ``--ignore-conflicts-at-my-risk`` and ``--delete-conflicting``
-  options to easy_install. These options have been deprecated since 0.6a11.
-
------
-0.9.8
------
-
-* `Issue #53 `_: Fix NameErrors in `_vcs_split_rev_from_url`.
-
------
-0.9.7
------
-
-* `Issue #49 `_: Correct AttributeError on PyPy where a hashlib.HASH object does
-  not have a `.name` attribute.
-* `Issue #34 `_: Documentation now refers to bootstrap script in code repository
-  referenced by bookmark.
-* Add underscore-separated keys to environment markers (markerlib).
-
------
-0.9.6
------
-
-* `Issue #44 `_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name`
-  attribute.
-
------
-0.9.5
------
-
-* `Python #17980 `_: Fix security vulnerability in SSL certificate validation.
-
------
-0.9.4
------
-
-* `Issue #43 `_: Fix issue (introduced in 0.9.1) with version resolution when
-  upgrading over other releases of Setuptools.
-
------
-0.9.3
------
-
-* `Issue #42 `_: Fix new ``AttributeError`` introduced in last fix.
-
------
-0.9.2
------
-
-* `Issue #42 `_: Fix regression where blank checksums would trigger an
-  ``AttributeError``.
-
------
-0.9.1
------
-
-* `Distribute #386 `_: Allow other positional and keyword arguments to os.open.
-* Corrected dependency on certifi mis-referenced in 0.9.
-
----
-0.9
----
-
-* `package_index` now validates hashes other than MD5 in download links.
-
----
-0.8
----
-
-* Code base now runs on Python 2.4 - Python 3.3 without Python 2to3
-  conversion.
-
------
-0.7.8
------
-
-* `Distribute #375 `_: Yet another fix for yet another regression.
-
------
-0.7.7
------
-
-* `Distribute #375 `_: Repair AttributeError created in last release (redo).
-* `Issue #30 `_: Added test for get_cache_path.
-
------
-0.7.6
------
-
-* `Distribute #375 `_: Repair AttributeError created in last release.
-
------
-0.7.5
------
-
-* `Issue #21 `_: Restore Python 2.4 compatibility in ``test_easy_install``.
-* `Distribute #375 `_: Merged additional warning from Distribute 0.6.46.
-* Now honor the environment variable
-  ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now
-  deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``.
-
------
-0.7.4
------
-
-* `Issue #20 `_: Fix comparison of parsed SVN version on Python 3.
-
------
-0.7.3
------
-
-* `Issue #1 `_: Disable installation of Windows-specific files on non-Windows systems.
-* Use new sysconfig module with Python 2.7 or >=3.2.
-
------
-0.7.2
------
-
-* `Issue #14 `_: Use markerlib when the `parser` module is not available.
-* `Issue #10 `_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI.
-
------
-0.7.1
------
-
-* Fix NameError (`Issue #3 `_) again - broken in bad merge.
-
----
-0.7
----
-
-* Merged Setuptools and Distribute. See docs/merge.txt for details.
-
-Added several features that were slated for setuptools 0.6c12:
-
-* Index URL now defaults to HTTPS.
-* Added experimental environment marker support. Now clients may designate a
-  PEP-426 environment marker for "extra" dependencies. Setuptools uses this
-  feature in ``setup.py`` for optional SSL and certificate validation support
-  on older platforms. Based on Distutils-SIG discussions, the syntax is
-  somewhat tentative. There should probably be a PEP with a firmer spec before
-  the feature should be considered suitable for use.
-* Added support for SSL certificate validation when installing packages from
-  an HTTPS service.
-
------
-0.7b4
------
-
-* `Issue #3 `_: Fixed NameError in SSL support.
-
-------
-0.6.49
-------
-
-* Move warning check in ``get_cache_path`` to follow the directory creation
-  to avoid errors when the cache path does not yet exist. Fixes the error
-  reported in `Distribute #375 `_.
-
-------
-0.6.48
-------
-
-* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
-  0.6.46 (redo).
-
-------
-0.6.47
-------
-
-* Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in
-  0.6.46.
-
-------
-0.6.46
-------
-
-* `Distribute #375 `_: Issue a warning if the PYTHON_EGG_CACHE or otherwise
-  customized egg cache location specifies a directory that's group- or
-  world-writable.
-
-------
-0.6.45
-------
-
-* `Distribute #379 `_: ``distribute_setup.py`` now traps VersionConflict as well,
-  restoring ability to upgrade from an older setuptools version.
-
-------
-0.6.44
-------
-
-* ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to
-  satisfy use_setuptools.
-
-------
-0.6.43
-------
-
-* `Distribute #378 `_: Restore support for Python 2.4 Syntax (regression in 0.6.42).
-
-------
-0.6.42
-------
-
-* External links finder no longer yields duplicate links.
-* `Distribute #337 `_: Moved site.py to setuptools/site-patch.py (graft of very old
-  patch from setuptools trunk which inspired PR `#31 `_).
-
-------
-0.6.41
-------
-
-* `Distribute #27 `_: Use public api for loading resources from zip files rather than
-  the private method `_zip_directory_cache`.
-* Added a new function ``easy_install.get_win_launcher`` which may be used by
-  third-party libraries such as buildout to get a suitable script launcher.
-
-------
-0.6.40
-------
-
-* `Distribute #376 `_: brought back cli.exe and gui.exe that were deleted in the
-  previous release.
-
-------
-0.6.39
-------
-
-* Add support for console launchers on ARM platforms.
-* Fix possible issue in GUI launchers where the subsystem was not supplied to
-  the linker.
-* Launcher build script now refactored for robustness.
-* `Distribute #375 `_: Resources extracted from a zip egg to the file system now also
-  check the contents of the file against the zip contents during each
-  invocation of get_resource_filename.
-
-------
-0.6.38
-------
-
-* `Distribute #371 `_: The launcher manifest file is now installed properly.
-
-------
-0.6.37
-------
-
-* `Distribute #143 `_: Launcher scripts, including easy_install itself, are now
-  accompanied by a manifest on 32-bit Windows environments to avoid the
-  Installer Detection Technology and thus undesirable UAC elevation described
-  in `this Microsoft article
-  `_.
-
-------
-0.6.36
-------
-
-* `Pull Request #35 `_: In `Buildout #64 `_, it was reported that
-  under Python 3, installation of distutils scripts could attempt to copy
-  the ``__pycache__`` directory as a file, causing an error, apparently only
-  under Windows. Easy_install now skips all directories when processing
-  metadata scripts.
-
-------
-0.6.35
-------
-
-
-Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in
-how it parses version numbers.
-
-* `Distribute #278 `_: Restored compatibility with distribute 0.6.22 and setuptools
-  0.6. Updated the documentation to match more closely with the version
-  parsing as intended in setuptools 0.6.
-
-------
-0.6.34
-------
-
-* `Distribute #341 `_: 0.6.33 fails to build under Python 2.4.
-
-------
-0.6.33
-------
-
-* Fix 2 errors with Jython 2.5.
-* Fix 1 failure with Jython 2.5 and 2.7.
-* Disable workaround for Jython scripts on Linux systems.
-* `Distribute #336 `_: `setup.py` no longer masks failure exit code when tests fail.
-* Fix issue in pkg_resources where try/except around a platform-dependent
-  import would trigger hook load failures on Mercurial. See pull request 32
-  for details.
-* `Distribute #341 `_: Fix a ResourceWarning.
-
-------
-0.6.32
-------
-
-* Fix test suite with Python 2.6.
-* Fix some DeprecationWarnings and ResourceWarnings.
-* `Distribute #335 `_: Backed out `setup_requires` superceding installed requirements
-  until regression can be addressed.
-
-------
-0.6.31
-------
-
-* `Distribute #303 `_: Make sure the manifest only ever contains UTF-8 in Python 3.
-* `Distribute #329 `_: Properly close files created by tests for compatibility with
-  Jython.
-* Work around `Jython #1980 `_ and `Jython #1981 `_.
-* `Distribute #334 `_: Provide workaround for packages that reference `sys.__stdout__`
-  such as numpy does. This change should address
-  `virtualenv `#359 `_ `_ as long
-  as the system encoding is UTF-8 or the IO encoding is specified in the
-  environment, i.e.::
-
-     PYTHONIOENCODING=utf8 pip install numpy
-
-* Fix for encoding issue when installing from Windows executable on Python 3.
-* `Distribute #323 `_: Allow `setup_requires` requirements to supercede installed
-  requirements. Added some new keyword arguments to existing pkg_resources
-  methods. Also had to updated how __path__ is handled for namespace packages
-  to ensure that when a new egg distribution containing a namespace package is
-  placed on sys.path, the entries in __path__ are found in the same order they
-  would have been in had that egg been on the path when pkg_resources was
-  first imported.
-
-------
-0.6.30
-------
-
-* `Distribute #328 `_: Clean up temporary directories in distribute_setup.py.
-* Fix fatal bug in distribute_setup.py.
-
-------
-0.6.29
-------
-
-* `Pull Request #14 `_: Honor file permissions in zip files.
-* `Distribute #327 `_: Merged pull request `#24 `_ to fix a dependency problem with pip.
-* Merged pull request `#23 `_ to fix https://github.com/pypa/virtualenv/issues/301.
-* If Sphinx is installed, the `upload_docs` command now runs `build_sphinx`
-  to produce uploadable documentation.
-* `Distribute #326 `_: `upload_docs` provided mangled auth credentials under Python 3.
-* `Distribute #320 `_: Fix check for "createable" in distribute_setup.py.
-* `Distribute #305 `_: Remove a warning that was triggered during normal operations.
-* `Distribute #311 `_: Print metadata in UTF-8 independent of platform.
-* `Distribute #303 `_: Read manifest file with UTF-8 encoding under Python 3.
-* `Distribute #301 `_: Allow to run tests of namespace packages when using 2to3.
-* `Distribute #304 `_: Prevent import loop in site.py under Python 3.3.
-* `Distribute #283 `_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3.
-* `Distribute #299 `_: The develop command didn't work on Python 3, when using 2to3,
-  as the egg link would go to the Python 2 source. Linking to the 2to3'd code
-  in build/lib makes it work, although you will have to rebuild the module
-  before testing it.
-* `Distribute #306 `_: Even if 2to3 is used, we build in-place under Python 2.
-* `Distribute #307 `_: Prints the full path when .svn/entries is broken.
-* `Distribute #313 `_: Support for sdist subcommands (Python 2.7)
-* `Distribute #314 `_: test_local_index() would fail an OS X.
-* `Distribute #310 `_: Non-ascii characters in a namespace __init__.py causes errors.
-* `Distribute #218 `_: Improved documentation on behavior of `package_data` and
-  `include_package_data`. Files indicated by `package_data` are now included
-  in the manifest.
-* `distribute_setup.py` now allows a `--download-base` argument for retrieving
-  distribute from a specified location.
-
-------
-0.6.28
-------
-
-* `Distribute #294 `_: setup.py can now be invoked from any directory.
-* Scripts are now installed honoring the umask.
-* Added support for .dist-info directories.
-* `Distribute #283 `_: Fix and disable scanning of `*.pyc` / `*.pyo` files on
-  Python 3.3.
-
-------
-0.6.27
-------
-
-* Support current snapshots of CPython 3.3.
-* Distribute now recognizes README.rst as a standard, default readme file.
-* Exclude 'encodings' modules when removing modules from sys.modules.
-  Workaround for `#285 `_.
-* `Distribute #231 `_: Don't fiddle with system python when used with buildout
-  (bootstrap.py)
-
-------
-0.6.26
-------
-
-* `Distribute #183 `_: Symlinked files are now extracted from source distributions.
-* `Distribute #227 `_: Easy_install fetch parameters are now passed during the
-  installation of a source distribution; now fulfillment of setup_requires
-  dependencies will honor the parameters passed to easy_install.
-
-------
-0.6.25
-------
-
-* `Distribute #258 `_: Workaround a cache issue
-* `Distribute #260 `_: distribute_setup.py now accepts the --user parameter for
-  Python 2.6 and later.
-* `Distribute #262 `_: package_index.open_with_auth no longer throws LookupError
-  on Python 3.
-* `Distribute #269 `_: AttributeError when an exception occurs reading Manifest.in
-  on late releases of Python.
-* `Distribute #272 `_: Prevent TypeError when namespace package names are unicode
-  and single-install-externally-managed is used. Also fixes PIP issue
-  449.
-* `Distribute #273 `_: Legacy script launchers now install with Python2/3 support.
-
-------
-0.6.24
-------
-
-* `Distribute #249 `_: Added options to exclude 2to3 fixers
-
-------
-0.6.23
-------
-
-* `Distribute #244 `_: Fixed a test
-* `Distribute #243 `_: Fixed a test
-* `Distribute #239 `_: Fixed a test
-* `Distribute #240 `_: Fixed a test
-* `Distribute #241 `_: Fixed a test
-* `Distribute #237 `_: Fixed a test
-* `Distribute #238 `_: easy_install now uses 64bit executable wrappers on 64bit Python
-* `Distribute #208 `_: Fixed parsed_versions, it now honors post-releases as noted in the documentation
-* `Distribute #207 `_: Windows cli and gui wrappers pass CTRL-C to child python process
-* `Distribute #227 `_: easy_install now passes its arguments to setup.py bdist_egg
-* `Distribute #225 `_: Fixed a NameError on Python 2.5, 2.4
-
-------
-0.6.21
-------
-
-* `Distribute #225 `_: FIxed a regression on py2.4
-
-------
-0.6.20
-------
-
-* `Distribute #135 `_: Include url in warning when processing URLs in package_index.
-* `Distribute #212 `_: Fix issue where easy_instal fails on Python 3 on windows installer.
-* `Distribute #213 `_: Fix typo in documentation.
-
-------
-0.6.19
-------
-
-* `Distribute #206 `_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders'
-
-------
-0.6.18
-------
-
-* `Distribute #210 `_: Fixed a regression introduced by `Distribute #204 `_ fix.
-
-------
-0.6.17
-------
-
-* Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment
-  variable to allow to disable installation of easy_install-${version} script.
-* Support Python >=3.1.4 and >=3.2.1.
-* `Distribute #204 `_: Don't try to import the parent of a namespace package in
-  declare_namespace
-* `Distribute #196 `_: Tolerate responses with multiple Content-Length headers
-* `Distribute #205 `_: Sandboxing doesn't preserve working_set. Leads to setup_requires
-  problems.
-
-------
-0.6.16
-------
-
-* Builds sdist gztar even on Windows (avoiding `Distribute #193 `_).
-* `Distribute #192 `_: Fixed metadata omitted on Windows when package_dir
-  specified with forward-slash.
-* `Distribute #195 `_: Cython build support.
-* `Distribute #200 `_: Issues with recognizing 64-bit packages on Windows.
-
-------
-0.6.15
-------
-
-* Fixed typo in bdist_egg
-* Several issues under Python 3 has been solved.
-* `Distribute #146 `_: Fixed missing DLL files after easy_install of windows exe package.
-
-------
-0.6.14
-------
-
-* `Distribute #170 `_: Fixed unittest failure. Thanks to Toshio.
-* `Distribute #171 `_: Fixed race condition in unittests cause deadlocks in test suite.
-* `Distribute #143 `_: Fixed a lookup issue with easy_install.
-  Thanks to David and Zooko.
-* `Distribute #174 `_: Fixed the edit mode when its used with setuptools itself
-
-------
-0.6.13
-------
-
-* `Distribute #160 `_: 2.7 gives ValueError("Invalid IPv6 URL")
-* `Distribute #150 `_: Fixed using ~/.local even in a --no-site-packages virtualenv
-* `Distribute #163 `_: scan index links before external links, and don't use the md5 when
-  comparing two distributions
-
-------
-0.6.12
-------
-
-* `Distribute #149 `_: Fixed various failures on 2.3/2.4
-
-------
-0.6.11
-------
-
-* Found another case of SandboxViolation - fixed
-* `Distribute #15 `_ and `Distribute #48 `_: Introduced a socket timeout of 15 seconds on url openings
-* Added indexsidebar.html into MANIFEST.in
-* `Distribute #108 `_: Fixed TypeError with Python3.1
-* `Distribute #121 `_: Fixed --help install command trying to actually install.
-* `Distribute #112 `_: Added an os.makedirs so that Tarek's solution will work.
-* `Distribute #133 `_: Added --no-find-links to easy_install
-* Added easy_install --user
-* `Distribute #100 `_: Fixed develop --user not taking '.' in PYTHONPATH into account
-* `Distribute #134 `_: removed spurious UserWarnings. Patch by VanLindberg
-* `Distribute #138 `_: cant_write_to_target error when setup_requires is used.
-* `Distribute #147 `_: respect the sys.dont_write_bytecode flag
-
-------
-0.6.10
-------
-
-* Reverted change made for the DistributionNotFound exception because
-  zc.buildout uses the exception message to get the name of the
-  distribution.
-
------
-0.6.9
------
-
-* `Distribute #90 `_: unknown setuptools version can be added in the working set
-* `Distribute #87 `_: setupt.py doesn't try to convert distribute_setup.py anymore
-  Initial Patch by arfrever.
-* `Distribute #89 `_: added a side bar with a download link to the doc.
-* `Distribute #86 `_: fixed missing sentence in pkg_resources doc.
-* Added a nicer error message when a DistributionNotFound is raised.
-* `Distribute #80 `_: test_develop now works with Python 3.1
-* `Distribute #93 `_: upload_docs now works if there is an empty sub-directory.
-* `Distribute #70 `_: exec bit on non-exec files
-* `Distribute #99 `_: now the standalone easy_install command doesn't uses a
-  "setup.cfg" if any exists in the working directory. It will use it
-  only if triggered by ``install_requires`` from a setup.py call
-  (install, develop, etc).
-* `Distribute #101 `_: Allowing ``os.devnull`` in Sandbox
-* `Distribute #92 `_: Fixed the "no eggs" found error with MacPort
-  (platform.mac_ver() fails)
-* `Distribute #103 `_: test_get_script_header_jython_workaround not run
-  anymore under py3 with C or POSIX local. Contributed by Arfrever.
-* `Distribute #104 `_: remvoved the assertion when the installation fails,
-  with a nicer message for the end user.
-* `Distribute #100 `_: making sure there's no SandboxViolation when
-  the setup script patches setuptools.
-
------
-0.6.8
------
-
-* Added "check_packages" in dist. (added in Setuptools 0.6c11)
-* Fixed the DONT_PATCH_SETUPTOOLS state.
-
------
-0.6.7
------
-
-* `Distribute #58 `_: Added --user support to the develop command
-* `Distribute #11 `_: Generated scripts now wrap their call to the script entry point
-  in the standard "if name == 'main'"
-* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv
-  can drive an installation that doesn't patch a global setuptools.
-* Reviewed unladen-swallow specific change from
-  http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719
-  and determined that it no longer applies. Distribute should work fine with
-  Unladen Swallow 2009Q3.
-* `Distribute #21 `_: Allow PackageIndex.open_url to gracefully handle all cases of a
-  httplib.HTTPException instead of just InvalidURL and BadStatusLine.
-* Removed virtual-python.py from this distribution and updated documentation
-  to point to the actively maintained virtualenv instead.
-* `Distribute #64 `_: use_setuptools no longer rebuilds the distribute egg every
-  time it is run
-* use_setuptools now properly respects the requested version
-* use_setuptools will no longer try to import a distribute egg for the
-  wrong Python version
-* `Distribute #74 `_: no_fake should be True by default.
-* `Distribute #72 `_: avoid a bootstrapping issue with easy_install -U
-
------
-0.6.6
------
-
-* Unified the bootstrap file so it works on both py2.x and py3k without 2to3
-  (patch by Holger Krekel)
-
------
-0.6.5
------
-
-* `Distribute #65 `_: cli.exe and gui.exe are now generated at build time,
-  depending on the platform in use.
-
-* `Distribute #67 `_: Fixed doc typo (PEP 381/382)
-
-* Distribute no longer shadows setuptools if we require a 0.7-series
-  setuptools.  And an error is raised when installing a 0.7 setuptools with
-  distribute.
-
-* When run from within buildout, no attempt is made to modify an existing
-  setuptools egg, whether in a shared egg directory or a system setuptools.
-
-* Fixed a hole in sandboxing allowing builtin file to write outside of
-  the sandbox.
-
------
-0.6.4
------
-
-* Added the generation of `distribute_setup_3k.py` during the release.
-  This closes `Distribute #52 `_.
-
-* Added an upload_docs command to easily upload project documentation to
-  PyPI's https://pythonhosted.org. This close issue `Distribute #56 `_.
-
-* Fixed a bootstrap bug on the use_setuptools() API.
-
------
-0.6.3
------
-
-setuptools
-==========
-
-* Fixed a bunch of calls to file() that caused crashes on Python 3.
-
-bootstrapping
-=============
-
-* Fixed a bug in sorting that caused bootstrap to fail on Python 3.
-
------
-0.6.2
------
-
-setuptools
-==========
-
-* Added Python 3 support; see docs/python3.txt.
-  This closes `Old Setuptools #39 `_.
-
-* Added option to run 2to3 automatically when installing on Python 3.
-  This closes issue `Distribute #31 `_.
-
-* Fixed invalid usage of requirement.parse, that broke develop -d.
-  This closes `Old Setuptools #44 `_.
-
-* Fixed script launcher for 64-bit Windows.
-  This closes `Old Setuptools #2 `_.
-
-* KeyError when compiling extensions.
-  This closes `Old Setuptools #41 `_.
-
-bootstrapping
-=============
-
-* Fixed bootstrap not working on Windows. This closes issue `Distribute #49 `_.
-
-* Fixed 2.6 dependencies. This closes issue `Distribute #50 `_.
-
-* Make sure setuptools is patched when running through easy_install
-  This closes `Old Setuptools #40 `_.
-
------
-0.6.1
------
-
-setuptools
-==========
-
-* package_index.urlopen now catches BadStatusLine and malformed url errors.
-  This closes `Distribute #16 `_ and `Distribute #18 `_.
-
-* zip_ok is now False by default. This closes `Old Setuptools #33 `_.
-
-* Fixed invalid URL error catching. `Old Setuptools #20 `_.
-
-* Fixed invalid bootstraping with easy_install installation (`Distribute #40 `_).
-  Thanks to Florian Schulze for the help.
-
-* Removed buildout/bootstrap.py. A new repository will create a specific
-  bootstrap.py script.
-
-
-bootstrapping
-=============
-
-* The boostrap process leave setuptools alone if detected in the system
-  and --root or --prefix is provided, but is not in the same location.
-  This closes `Distribute #10 `_.
-
----
-0.6
----
-
-setuptools
-==========
-
-* Packages required at build time where not fully present at install time.
-  This closes `Distribute #12 `_.
-
-* Protected against failures in tarfile extraction. This closes `Distribute #10 `_.
-
-* Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 `_.
-
-* sandbox.py replaced builtin type file with builtin function open. This
-  closes `Distribute #6 `_.
-
-* Immediately close all file handles. This closes `Distribute #3 `_.
-
-* Added compatibility with Subversion 1.6. This references `Distribute #1 `_.
-
-pkg_resources
-=============
-
-* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API
-  instead. Based on a patch from ronaldoussoren. This closes issue `#5 `_.
-
-* Fixed a SandboxViolation for mkdir that could occur in certain cases.
-  This closes `Distribute #13 `_.
-
-* Allow to find_on_path on systems with tight permissions to fail gracefully.
-  This closes `Distribute #9 `_.
-
-* Corrected inconsistency between documentation and code of add_entry.
-  This closes `Distribute #8 `_.
-
-* Immediately close all file handles. This closes `Distribute #3 `_.
-
-easy_install
-============
-
-* Immediately close all file handles. This closes `Distribute #3 `_.
-
------
-0.6c9
------
-
- * Fixed a missing files problem when using Windows source distributions on
-   non-Windows platforms, due to distutils not handling manifest file line
-   endings correctly.
-
- * Updated Pyrex support to work with Pyrex 0.9.6 and higher.
-
- * Minor changes for Jython compatibility, including skipping tests that can't
-   work on Jython.
-
- * Fixed not installing eggs in ``install_requires`` if they were also used for
-   ``setup_requires`` or ``tests_require``.
-
- * Fixed not fetching eggs in ``install_requires`` when running tests.
-
- * Allow ``ez_setup.use_setuptools()`` to upgrade existing setuptools
-   installations when called from a standalone ``setup.py``.
-
- * Added a warning if a namespace package is declared, but its parent package
-   is not also declared as a namespace.
-
- * Support Subversion 1.5
-
- * Removed use of deprecated ``md5`` module if ``hashlib`` is available
-
- * Fixed ``bdist_wininst upload`` trying to upload the ``.exe`` twice
-
- * Fixed ``bdist_egg`` putting a ``native_libs.txt`` in the source package's
-   ``.egg-info``, when it should only be in the built egg's ``EGG-INFO``.
-
- * Ensure that _full_name is set on all shared libs before extensions are
-   checked for shared lib usage.  (Fixes a bug in the experimental shared
-   library build support.)
-
- * Fix to allow unpacked eggs containing native libraries to fail more
-   gracefully under Google App Engine (with an ``ImportError`` loading the
-   C-based module, instead of getting a ``NameError``).
-
------
-0.6c7
------
-
- * Fixed ``distutils.filelist.findall()`` crashing on broken symlinks, and
-   ``egg_info`` command failing on new, uncommitted SVN directories.
-
- * Fix import problems with nested namespace packages installed via
-   ``--root`` or ``--single-version-externally-managed``, due to the
-   parent package not having the child package as an attribute.
-
------
-0.6c6
------
-
- * Added ``--egg-path`` option to ``develop`` command, allowing you to force
-   ``.egg-link`` files to use relative paths (allowing them to be shared across
-   platforms on a networked drive).
-
- * Fix not building binary RPMs correctly.
-
- * Fix "eggsecutables" (such as setuptools' own egg) only being runnable with
-   bash-compatible shells.
-
- * Fix ``#!`` parsing problems in Windows ``.exe`` script wrappers, when there
-   was whitespace inside a quoted argument or at the end of the ``#!`` line
-   (a regression introduced in 0.6c4).
-
- * Fix ``test`` command possibly failing if an older version of the project
-   being tested was installed on ``sys.path`` ahead of the test source
-   directory.
-
- * Fix ``find_packages()`` treating ``ez_setup`` and directories with ``.`` in
-   their names as packages.
-
------
-0.6c5
------
-
- * Fix uploaded ``bdist_rpm`` packages being described as ``bdist_egg``
-   packages under Python versions less than 2.5.
-
- * Fix uploaded ``bdist_wininst`` packages being described as suitable for
-   "any" version by Python 2.5, even if a ``--target-version`` was specified.
-
------
-0.6c4
------
-
- * Overhauled Windows script wrapping to support ``bdist_wininst`` better.
-   Scripts installed with ``bdist_wininst`` will always use ``#!python.exe`` or
-   ``#!pythonw.exe`` as the executable name (even when built on non-Windows
-   platforms!), and the wrappers will look for the executable in the script's
-   parent directory (which should find the right version of Python).
-
- * Fix ``upload`` command not uploading files built by ``bdist_rpm`` or
-   ``bdist_wininst`` under Python 2.3 and 2.4.
-
- * Add support for "eggsecutable" headers: a ``#!/bin/sh`` script that is
-   prepended to an ``.egg`` file to allow it to be run as a script on Unix-ish
-   platforms.  (This is mainly so that setuptools itself can have a single-file
-   installer on Unix, without doing multiple downloads, dealing with firewalls,
-   etc.)
-
- * Fix problem with empty revision numbers in Subversion 1.4 ``entries`` files
-
- * Use cross-platform relative paths in ``easy-install.pth`` when doing
-   ``develop`` and the source directory is a subdirectory of the installation
-   target directory.
-
- * Fix a problem installing eggs with a system packaging tool if the project
-   contained an implicit namespace package; for example if the ``setup()``
-   listed a namespace package ``foo.bar`` without explicitly listing ``foo``
-   as a namespace package.
-
------
-0.6c3
------
-
- * Fixed breakages caused by Subversion 1.4's new "working copy" format
-
------
-0.6c2
------
-
- * The ``ez_setup`` module displays the conflicting version of setuptools (and
-   its installation location) when a script requests a version that's not
-   available.
-
- * Running ``setup.py develop`` on a setuptools-using project will now install
-   setuptools if needed, instead of only downloading the egg.
-
------
-0.6c1
------
-
- * Fixed ``AttributeError`` when trying to download a ``setup_requires``
-   dependency when a distribution lacks a ``dependency_links`` setting.
-
- * Made ``zip-safe`` and ``not-zip-safe`` flag files contain a single byte, so
-   as to play better with packaging tools that complain about zero-length
-   files.
-
- * Made ``setup.py develop`` respect the ``--no-deps`` option, which it
-   previously was ignoring.
-
- * Support ``extra_path`` option to ``setup()`` when ``install`` is run in
-   backward-compatibility mode.
-
- * Source distributions now always include a ``setup.cfg`` file that explicitly
-   sets ``egg_info`` options such that they produce an identical version number
-   to the source distribution's version number.  (Previously, the default
-   version number could be different due to the use of ``--tag-date``, or if
-   the version was overridden on the command line that built the source
-   distribution.)
-
------
-0.6b4
------
-
- * Fix ``register`` not obeying name/version set by ``egg_info`` command, if
-   ``egg_info`` wasn't explicitly run first on the same command line.
-
- * Added ``--no-date`` and ``--no-svn-revision`` options to ``egg_info``
-   command, to allow suppressing tags configured in ``setup.cfg``.
-
- * Fixed redundant warnings about missing ``README`` file(s); it should now
-   appear only if you are actually a source distribution.
-
------
-0.6b3
------
-
- * Fix ``bdist_egg`` not including files in subdirectories of ``.egg-info``.
-
- * Allow ``.py`` files found by the ``include_package_data`` option to be
-   automatically included.  Remove duplicate data file matches if both
-   ``include_package_data`` and ``package_data`` are used to refer to the same
-   files.
-
------
-0.6b1
------
-
- * Strip ``module`` from the end of compiled extension modules when computing
-   the name of a ``.py`` loader/wrapper.  (Python's import machinery ignores
-   this suffix when searching for an extension module.)
-
-------
-0.6a11
-------
-
- * Added ``test_loader`` keyword to support custom test loaders
-
- * Added ``setuptools.file_finders`` entry point group to allow implementing
-   revision control plugins.
-
- * Added ``--identity`` option to ``upload`` command.
-
- * Added ``dependency_links`` to allow specifying URLs for ``--find-links``.
-
- * Enhanced test loader to scan packages as well as modules, and call
-   ``additional_tests()`` if present to get non-unittest tests.
-
- * Support namespace packages in conjunction with system packagers, by omitting
-   the installation of any ``__init__.py`` files for namespace packages, and
-   adding a special ``.pth`` file to create a working package in
-   ``sys.modules``.
-
- * Made ``--single-version-externally-managed`` automatic when ``--root`` is
-   used, so that most system packagers won't require special support for
-   setuptools.
-
- * Fixed ``setup_requires``, ``tests_require``, etc. not using ``setup.cfg`` or
-   other configuration files for their option defaults when installing, and
-   also made the install use ``--multi-version`` mode so that the project
-   directory doesn't need to support .pth files.
-
- * ``MANIFEST.in`` is now forcibly closed when any errors occur while reading
-   it.  Previously, the file could be left open and the actual error would be
-   masked by problems trying to remove the open file on Windows systems.
-
-------
-0.6a10
-------
-
- * Fixed the ``develop`` command ignoring ``--find-links``.
-
------
-0.6a9
------
-
- * The ``sdist`` command no longer uses the traditional ``MANIFEST`` file to
-   create source distributions.  ``MANIFEST.in`` is still read and processed,
-   as are the standard defaults and pruning.  But the manifest is built inside
-   the project's ``.egg-info`` directory as ``SOURCES.txt``, and it is rebuilt
-   every time the ``egg_info`` command is run.
-
- * Added the ``include_package_data`` keyword to ``setup()``, allowing you to
-   automatically include any package data listed in revision control or
-   ``MANIFEST.in``
-
- * Added the ``exclude_package_data`` keyword to ``setup()``, allowing you to
-   trim back files included via the ``package_data`` and
-   ``include_package_data`` options.
-
- * Fixed ``--tag-svn-revision`` not working when run from a source
-   distribution.
-
- * Added warning for namespace packages with missing ``declare_namespace()``
-
- * Added ``tests_require`` keyword to ``setup()``, so that e.g. packages
-   requiring ``nose`` to run unit tests can make this dependency optional
-   unless the ``test`` command is run.
-
- * Made all commands that use ``easy_install`` respect its configuration
-   options, as this was causing some problems with ``setup.py install``.
-
- * Added an ``unpack_directory()`` driver to ``setuptools.archive_util``, so
-   that you can process a directory tree through a processing filter as if it
-   were a zipfile or tarfile.
-
- * Added an internal ``install_egg_info`` command to use as part of old-style
-   ``install`` operations, that installs an ``.egg-info`` directory with the
-   package.
-
- * Added a ``--single-version-externally-managed`` option to the ``install``
-   command so that you can more easily wrap a "flat" egg in a system package.
-
- * Enhanced ``bdist_rpm`` so that it installs single-version eggs that
-   don't rely on a ``.pth`` file.  The ``--no-egg`` option has been removed,
-   since all RPMs are now built in a more backwards-compatible format.
-
- * Support full roundtrip translation of eggs to and from ``bdist_wininst``
-   format.  Running ``bdist_wininst`` on a setuptools-based package wraps the
-   egg in an .exe that will safely install it as an egg (i.e., with metadata
-   and entry-point wrapper scripts), and ``easy_install`` can turn the .exe
-   back into an ``.egg`` file or directory and install it as such.
-
-
------
-0.6a8
------
-
- * Fixed some problems building extensions when Pyrex was installed, especially
-   with Python 2.4 and/or packages using SWIG.
-
- * Made ``develop`` command accept all the same options as ``easy_install``,
-   and use the ``easy_install`` command's configuration settings as defaults.
-
- * Made ``egg_info --tag-svn-revision`` fall back to extracting the revision
-   number from ``PKG-INFO`` in case it is being run on a source distribution of
-   a snapshot taken from a Subversion-based project.
-
- * Automatically detect ``.dll``, ``.so`` and ``.dylib`` files that are being
-   installed as data, adding them to ``native_libs.txt`` automatically.
-
- * Fixed some problems with fresh checkouts of projects that don't include
-   ``.egg-info/PKG-INFO`` under revision control and put the project's source
-   code directly in the project directory.  If such a package had any
-   requirements that get processed before the ``egg_info`` command can be run,
-   the setup scripts would fail with a "Missing 'Version:' header and/or
-   PKG-INFO file" error, because the egg runtime interpreted the unbuilt
-   metadata in a directory on ``sys.path`` (i.e. the current directory) as
-   being a corrupted egg.  Setuptools now monkeypatches the distribution
-   metadata cache to pretend that the egg has valid version information, until
-   it has a chance to make it actually be so (via the ``egg_info`` command).
-
------
-0.6a5
------
-
- * Fixed missing gui/cli .exe files in distribution.  Fixed bugs in tests.
-
------
-0.6a3
------
-
- * Added ``gui_scripts`` entry point group to allow installing GUI scripts
-   on Windows and other platforms.  (The special handling is only for Windows;
-   other platforms are treated the same as for ``console_scripts``.)
-
------
-0.6a2
------
-
- * Added ``console_scripts`` entry point group to allow installing scripts
-   without the need to create separate script files.  On Windows, console
-   scripts get an ``.exe`` wrapper so you can just type their name.  On other
-   platforms, the scripts are written without a file extension.
-
------
-0.6a1
------
-
- * Added support for building "old-style" RPMs that don't install an egg for
-   the target package, using a ``--no-egg`` option.
-
- * The ``build_ext`` command now works better when using the ``--inplace``
-   option and multiple Python versions.  It now makes sure that all extensions
-   match the current Python version, even if newer copies were built for a
-   different Python version.
-
- * The ``upload`` command no longer attaches an extra ``.zip`` when uploading
-   eggs, as PyPI now supports egg uploads without trickery.
-
- * The ``ez_setup`` script/module now displays a warning before downloading
-   the setuptools egg, and attempts to check the downloaded egg against an
-   internal MD5 checksum table.
-
- * Fixed the ``--tag-svn-revision`` option of ``egg_info`` not finding the
-   latest revision number; it was using the revision number of the directory
-   containing ``setup.py``, not the highest revision number in the project.
-
- * Added ``eager_resources`` setup argument
-
- * The ``sdist`` command now recognizes Subversion "deleted file" entries and
-   does not include them in source distributions.
-
- * ``setuptools`` now embeds itself more thoroughly into the distutils, so that
-   other distutils extensions (e.g. py2exe, py2app) will subclass setuptools'
-   versions of things, rather than the native distutils ones.
-
- * Added ``entry_points`` and ``setup_requires`` arguments to ``setup()``;
-   ``setup_requires`` allows you to automatically find and download packages
-   that are needed in order to *build* your project (as opposed to running it).
-
- * ``setuptools`` now finds its commands, ``setup()`` argument validators, and
-   metadata writers using entry points, so that they can be extended by
-   third-party packages.  See `Creating distutils Extensions
-   `_
-   for more details.
-
- * The vestigial ``depends`` command has been removed.  It was never finished
-   or documented, and never would have worked without EasyInstall - which it
-   pre-dated and was never compatible with.
-
-------
-0.5a12
-------
-
- * The zip-safety scanner now checks for modules that might be used with
-   ``python -m``, and marks them as unsafe for zipping, since Python 2.4 can't
-   handle ``-m`` on zipped modules.
-
-------
-0.5a11
-------
-
- * Fix breakage of the "develop" command that was caused by the addition of
-   ``--always-unzip`` to the ``easy_install`` command.
-
------
-0.5a9
------
-
- * Include ``svn:externals`` directories in source distributions as well as
-   normal subversion-controlled files and directories.
-
- * Added ``exclude=patternlist`` option to ``setuptools.find_packages()``
-
- * Changed --tag-svn-revision to include an "r" in front of the revision number
-   for better readability.
-
- * Added ability to build eggs without including source files (except for any
-   scripts, of course), using the ``--exclude-source-files`` option to
-   ``bdist_egg``.
-
- * ``setup.py install`` now automatically detects when an "unmanaged" package
-   or module is going to be on ``sys.path`` ahead of a package being installed,
-   thereby preventing the newer version from being imported.  If this occurs,
-   a warning message is output to ``sys.stderr``, but installation proceeds
-   anyway.  The warning message informs the user what files or directories
-   need deleting, and advises them they can also use EasyInstall (with the
-   ``--delete-conflicting`` option) to do it automatically.
-
- * The ``egg_info`` command now adds a ``top_level.txt`` file to the metadata
-   directory that lists all top-level modules and packages in the distribution.
-   This is used by the ``easy_install`` command to find possibly-conflicting
-   "unmanaged" packages when installing the distribution.
-
- * Added ``zip_safe`` and ``namespace_packages`` arguments to ``setup()``.
-   Added package analysis to determine zip-safety if the ``zip_safe`` flag
-   is not given, and advise the author regarding what code might need changing.
-
- * Fixed the swapped ``-d`` and ``-b`` options of ``bdist_egg``.
-
------
-0.5a8
------
-
- * The "egg_info" command now always sets the distribution metadata to "safe"
-   forms of the distribution name and version, so that distribution files will
-   be generated with parseable names (i.e., ones that don't include '-' in the
-   name or version).  Also, this means that if you use the various ``--tag``
-   options of "egg_info", any distributions generated will use the tags in the
-   version, not just egg distributions.
-
- * Added support for defining command aliases in distutils configuration files,
-   under the "[aliases]" section.  To prevent recursion and to allow aliases to
-   call the command of the same name, a given alias can be expanded only once
-   per command-line invocation.  You can define new aliases with the "alias"
-   command, either for the local, global, or per-user configuration.
-
- * Added "rotate" command to delete old distribution files, given a set of
-   patterns to match and the number of files to keep.  (Keeps the most
-   recently-modified distribution files matching each pattern.)
-
- * Added "saveopts" command that saves all command-line options for the current
-   invocation to the local, global, or per-user configuration file.  Useful for
-   setting defaults without having to hand-edit a configuration file.
-
- * Added a "setopt" command that sets a single option in a specified distutils
-   configuration file.
-
------
-0.5a7
------
-
- * Added "upload" support for egg and source distributions, including a bug
-   fix for "upload" and a temporary workaround for lack of .egg support in
-   PyPI.
-
------
-0.5a6
------
-
- * Beefed up the "sdist" command so that if you don't have a MANIFEST.in, it
-   will include all files under revision control (CVS or Subversion) in the
-   current directory, and it will regenerate the list every time you create a
-   source distribution, not just when you tell it to.  This should make the
-   default "do what you mean" more often than the distutils' default behavior
-   did, while still retaining the old behavior in the presence of MANIFEST.in.
-
- * Fixed the "develop" command always updating .pth files, even if you
-   specified ``-n`` or ``--dry-run``.
-
- * Slightly changed the format of the generated version when you use
-   ``--tag-build`` on the "egg_info" command, so that you can make tagged
-   revisions compare *lower* than the version specified in setup.py (e.g. by
-   using ``--tag-build=dev``).
-
------
-0.5a5
------
-
- * Added ``develop`` command to ``setuptools``-based packages.  This command
-   installs an ``.egg-link`` pointing to the package's source directory, and
-   script wrappers that ``execfile()`` the source versions of the package's
-   scripts.  This lets you put your development checkout(s) on sys.path without
-   having to actually install them.  (To uninstall the link, use
-   use ``setup.py develop --uninstall``.)
-
- * Added ``egg_info`` command to ``setuptools``-based packages.  This command
-   just creates or updates the "projectname.egg-info" directory, without
-   building an egg.  (It's used by the ``bdist_egg``, ``test``, and ``develop``
-   commands.)
-
- * Enhanced the ``test`` command so that it doesn't install the package, but
-   instead builds any C extensions in-place, updates the ``.egg-info``
-   metadata, adds the source directory to ``sys.path``, and runs the tests
-   directly on the source.  This avoids an "unmanaged" installation of the
-   package to ``site-packages`` or elsewhere.
-
- * Made ``easy_install`` a standard ``setuptools`` command, moving it from
-   the ``easy_install`` module to ``setuptools.command.easy_install``.  Note
-   that if you were importing or extending it, you must now change your imports
-   accordingly.  ``easy_install.py`` is still installed as a script, but not as
-   a module.
-
------
-0.5a4
------
-
- * Setup scripts using setuptools can now list their dependencies directly in
-   the setup.py file, without having to manually create a ``depends.txt`` file.
-   The ``install_requires`` and ``extras_require`` arguments to ``setup()``
-   are used to create a dependencies file automatically.  If you are manually
-   creating ``depends.txt`` right now, please switch to using these setup
-   arguments as soon as practical, because ``depends.txt`` support will be
-   removed in the 0.6 release cycle.  For documentation on the new arguments,
-   see the ``setuptools.dist.Distribution`` class.
-
- * Setup scripts using setuptools now always install using ``easy_install``
-   internally, for ease of uninstallation and upgrading.
-
------
-0.5a1
------
-
- * Added support for "self-installation" bootstrapping.  Packages can now
-   include ``ez_setup.py`` in their source distribution, and add the following
-   to their ``setup.py``, in order to automatically bootstrap installation of
-   setuptools as part of their setup process::
-
-    from ez_setup import use_setuptools
-    use_setuptools()
-
-    from setuptools import setup
-    # etc...
-
------
-0.4a2
------
-
- * Added ``ez_setup.py`` installer/bootstrap script to make initial setuptools
-   installation easier, and to allow distributions using setuptools to avoid
-   having to include setuptools in their source distribution.
-
- * All downloads are now managed by the ``PackageIndex`` class (which is now
-   subclassable and replaceable), so that embedders can more easily override
-   download logic, give download progress reports, etc.  The class has also
-   been moved to the new ``setuptools.package_index`` module.
-
- * The ``Installer`` class no longer handles downloading, manages a temporary
-   directory, or tracks the ``zip_ok`` option.  Downloading is now handled
-   by ``PackageIndex``, and ``Installer`` has become an ``easy_install``
-   command class based on ``setuptools.Command``.
-
- * There is a new ``setuptools.sandbox.run_setup()`` API to invoke a setup
-   script in a directory sandbox, and a new ``setuptools.archive_util`` module
-   with an ``unpack_archive()`` API.  These were split out of EasyInstall to
-   allow reuse by other tools and applications.
-
- * ``setuptools.Command`` now supports reinitializing commands using keyword
-   arguments to set/reset options.  Also, ``Command`` subclasses can now set
-   their ``command_consumes_arguments`` attribute to ``True`` in order to
-   receive an ``args`` option containing the rest of the command line.
-
------
-0.3a2
------
-
- * Added new options to ``bdist_egg`` to allow tagging the egg's version number
-   with a subversion revision number, the current date, or an explicit tag
-   value.  Run ``setup.py bdist_egg --help`` to get more information.
-
- * Misc. bug fixes
-
------
-0.3a1
------
-
- * Initial release.
-
-
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/RECORD b/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/RECORD
deleted file mode 100644
index e519a35..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/RECORD
+++ /dev/null
@@ -1,166 +0,0 @@
-easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126
-pkg_resources.py,sha256=WKXd8GioLIuX5NYkaYNdzLmCbXIH-cdo900dtGVaTBo,100974
-setuptools/archive_util.py,sha256=xr6Xl-PbXymPMuuq5TokDMs7SvKMVKsjUegw8mpj7_g,6556
-setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
-setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752
-setuptools/cli-arm-32.exe,sha256=0pFNIi2SmY2gdY91Y4LRhj1wuBsnv5cG1fus3iBJv40,69120
-setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536
-setuptools/compat.py,sha256=-Hl58PuLOEHUDM3-qsgmk50qNiyLLF3RgBgJ-eGGZG0,2094
-setuptools/depends.py,sha256=gMRnrqQSr_Yp_wf09O88vKSQah1YjjEi5PsDNezM2Hs,6370
-setuptools/dist.py,sha256=tzUrozVQmFJxuvRVyisQqT_JURxR5OgJ3zHaLvFq2Is,33406
-setuptools/extension.py,sha256=ph9C_JTTthk_w2xEW3Tdpms_EPFCYRSxANw-F5UAqsI,1821
-setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
-setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264
-setuptools/gui-arm-32.exe,sha256=R5gRWLkY7wvO_CVGxoi7LZVTv0h-DKsKScy6fkbp4XI,69120
-setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536
-setuptools/lib2to3_ex.py,sha256=6jPF9sJuHiz0cyg4cwIBLl2VMAxcl3GYSZwWAOuJplU,1998
-setuptools/msvc9_support.py,sha256=vVfk9Y6QvSEgjDooEc8uLqjMrPFRXL5VofDIKQi1EFs,2188
-setuptools/package_index.py,sha256=IOHE81H91eEcR80gMquyQuU9Rh9cv7_6JOLLB0iNbhs,38943
-setuptools/py26compat.py,sha256=ggKS8_aZWWHHS792vF3uXp5vmUkGNk3vjLreLTHr_-Q,431
-setuptools/py27compat.py,sha256=CGj-jZcFgHUkrEdLvArkxHj96tAaMbG2-yJtUVU7QVI,306
-setuptools/py31compat.py,sha256=O3X_wdWrvXTifeSFbRaCMuc23cDhMHJn7QlITb5cQ8E,1637
-setuptools/sandbox.py,sha256=U5QwtrByF-ITHzGl1FyxhoRYdvNeic6-Ie-N6XW0Ybc,10430
-setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201
-setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138
-setuptools/site-patch.py,sha256=K-0-cAx36mX_PG-qPZwosG9ZLCliRjquKQ4nHiJvvzg,2389
-setuptools/ssl_support.py,sha256=FASqXlRCmXAi6LUWLUIo0u14MpJqHBgkOc5KPHSRrtI,8044
-setuptools/svn_utils.py,sha256=SDSOSVpbAvWoswgKdTQAOxd8pEd1ZdRtqD4skntW6-E,18855
-setuptools/unicode_utils.py,sha256=gvhAHRj1LELCz-1MP3rfXGi__O1CAm5aksO9Njd2lpU,981
-setuptools/utils.py,sha256=08Z7mt-9mvrx-XvmS5EyKoRn2lxNTlgFsUwBU3Eq9JQ,293
-setuptools/version.py,sha256=hGqPB0hmCaq_OizI44M2dAaitOf_dLYmD4ACQAs5F94,22
-setuptools/__init__.py,sha256=CliC3Pe-ej7j-iPQ1fu9Rkh2DdrfkBzRcSIJ3vF5dmg,5195
-setuptools/command/alias.py,sha256=1sLQxZcNh6dDQpDmm4G7UGGTol83nY1NTPmNBbm2siI,2381
-setuptools/command/bdist_egg.py,sha256=vGysGAHsTGSbSUwEBtHZ-Mtz54nU_tSwcc8DlnHfM7A,17606
-setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508
-setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637
-setuptools/command/build_ext.py,sha256=cukClSx-aLSuWmhWLmXPNDNr9ZHpFL7a01z71bwy9Go,12324
-setuptools/command/build_py.py,sha256=FtFC7cRlKQCHT4-1yDey3igltuiGwFh8VsFg2U0B0kw,8644
-setuptools/command/develop.py,sha256=uyRwABU1JnhQhZO9rS8-nenkzLwKKJt2P7WPnsXrHd4,6610
-setuptools/command/easy_install.py,sha256=Nsa4Zj-oUL4GAI5KDxy1HTJ1KCJbm6sDPUEPv036xf4,82661
-setuptools/command/egg_info.py,sha256=6B4Gh1qPpPGPcyFL3R68SsTLGwownVDkauJl_X1bVFg,15212
-setuptools/command/install.py,sha256=QwaFiZRU3ytIHoPh8uJ9EqV3Fu9C4ca4B7UGAo95tws,4685
-setuptools/command/install_egg_info.py,sha256=KXNB8O34-rK-cZZZr2fnT8kqNktDmTfUA88X2Iln66c,4001
-setuptools/command/install_lib.py,sha256=ntpy-9xiFHfDmXmX_Lfp7nMchw7FpgyP66H7reixI_Y,3771
-setuptools/command/install_scripts.py,sha256=evsgRosqRxlww6l7BBx43RINpAbLd1raVkW2-dmFCyU,2041
-setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628
-setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270
-setuptools/command/rotate.py,sha256=Qm7SOa32L9XG5b_C7_SSYvKM5rqFXroeQ6w8GXIsY2o,2038
-setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658
-setuptools/command/sdist.py,sha256=Nx1zjnpFJwk1gVvm96TDAoq_aHDH_53hWRKq8Wmjvgg,8604
-setuptools/command/setopt.py,sha256=Z3_kav60D2XHZjM0cRhGo7wbBYo7nr4U_U-wMMbpmu8,5080
-setuptools/command/test.py,sha256=-ZbBhuoKrfOx_pgA-53H-qRw6Z9evRP8_z1KdKI7yvw,6481
-setuptools/command/upload_docs.py,sha256=617bECKkdDizKaV_kN62hXjgmwKMbpY4l3zecNEdjNk,6811
-setuptools/command/__init__.py,sha256=gQMXoLa0TtUtmUZY0ptSouWWA5kcTArWyDQ6QwkjoVQ,554
-setuptools/tests/environment.py,sha256=Sl9Pok7ZEakC6YXP8urDkh9-XxQpoJAzyzzZUqOGOXQ,4658
-setuptools/tests/py26compat.py,sha256=i_JBukWMEat4AM1FtU8DAd06r0gjZR3uma_jb_gxEXU,267
-setuptools/tests/script-with-bom.py,sha256=nWOGL62VEQBsH5GaZvCyRyYqobziynGaqQJisffifsc,46
-setuptools/tests/server.py,sha256=Fqk53860mwB_wDNOzixZLjCq_c8_1kaGiXBm5fHco2c,2651
-setuptools/tests/test_bdist_egg.py,sha256=yD2dP8ApUtyo4rpwzSEGgeLjxihU7xHVAK2O2bCL52U,1962
-setuptools/tests/test_build_ext.py,sha256=mfWDSPPR2auCi3AbZILJp-175Dj0551d6xpvM0md4zE,650
-setuptools/tests/test_develop.py,sha256=JFvKRFbjzsExQBmg1kN-dWijhPY4uGO1TMQFDy9QFoc,3496
-setuptools/tests/test_dist_info.py,sha256=ZgVLERe6WZpWUcwrLGk2b_cSOMZMASLV1hTV4hgQLG0,2615
-setuptools/tests/test_easy_install.py,sha256=vjr2KNv78vgLg7otZeqz9yPXe0M7gOxiOE5MRvARblk,15704
-setuptools/tests/test_egg_info.py,sha256=mJ8BDZuIWe_4-2mo_OQGAdi0DG1mS3pm0ZAEPdS_2vc,6745
-setuptools/tests/test_find_packages.py,sha256=McPOROBbIR7JK5a2tMWTA88S6LrbcGMnPAZ66Oq32AQ,6005
-setuptools/tests/test_integration.py,sha256=gXHi9iQ9LMqAjWcoGe4yvS-H3UczoOW3ij-x-afP0a4,2506
-setuptools/tests/test_markerlib.py,sha256=UYBTjaug56cWxIwlCubdSTGZ-s9bqB1co54636x0xfo,2506
-setuptools/tests/test_msvc9compiler.py,sha256=XDCexE-n1vPmcJIIHQyNalDm2EcquW_S6V1CAfdjayk,5617
-setuptools/tests/test_packageindex.py,sha256=8vay-a5Dry_cg71WFA1rlofIWO5c9KI6D6PKN4WKKiI,7625
-setuptools/tests/test_resources.py,sha256=-YyuIR1EGofI44SycRIhF59NCxP_r8MD8iZj7aBGXHg,23639
-setuptools/tests/test_sandbox.py,sha256=bdUzddjT6dojVbFOHQPFqqYaLGAMcLKVlWI_ADcY9SE,2364
-setuptools/tests/test_sdist.py,sha256=6RoBhb-GeyzK1vt4J5jFOfvr6ibjJVbFlJktiO6Ls2w,19045
-setuptools/tests/test_svn.py,sha256=UI9rRTWQDw7NGRzSKmgcsnkDGX8M4QDj447kCXvf5D8,7806
-setuptools/tests/test_test.py,sha256=pnN_pLgda5uEJU0-X8n04g90OaxQ5_CTsLTxy2SqR80,3697
-setuptools/tests/test_upload_docs.py,sha256=N__IVGihRBRqA3PetRcIDmNFu1XOhR7ix0e50xMuq_M,2139
-setuptools/tests/__init__.py,sha256=6dOlIFbLaq185Y7B7wNUXwMGl1UCGGdM98pYTzMDmYQ,12531
-setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-setuptools/_vendor/packaging/version.py,sha256=7CVQcHdtoeHsafRfjCBc5SG5Wg3SzY2NQR5UD1SJKrI,26559
-setuptools/_vendor/packaging/_compat.py,sha256=a95VQwJSBuU5Z74gjfkiXsiE54MPR4fXIQU9PiqpsvQ,800
-setuptools/_vendor/packaging/_structures.py,sha256=93YvgrEE2HgFp8AdXy0pwCRVnZeutRHO_-puJ7T0cPw,1809
-setuptools/_vendor/packaging/__about__.py,sha256=ZszNzs5_oxVVHyFdNAxM4yzJ7pHmQaXo1cUbf2xAAtw,1073
-setuptools/_vendor/packaging/__init__.py,sha256=2V8n-eEpSgBuXlV8hlMmhU7ZklpsrrusWMZNp2gC4Hs,906
-setuptools-6.0.2.dist-info/dependency_links.txt,sha256=UaFV2I99Rbdie_2lV4pEX6M2jKNDN7RhFSbiL1-PDiY,221
-setuptools-6.0.2.dist-info/DESCRIPTION.rst,sha256=4qJuy_Iu2M0r2utPdQiCuNynTJEBS2ojXprb1lknImU,84114
-setuptools-6.0.2.dist-info/entry_points.txt,sha256=wxdNYALrJxn2PJtYZXehrEYO05eRXr7j2I3vzIu3hK4,2872
-setuptools-6.0.2.dist-info/METADATA,sha256=8Z_ApY-PWD-SA7iVX66fapng4BiFIUQb2VK0EHDDjMg,85476
-setuptools-6.0.2.dist-info/metadata.json,sha256=44bzVnOVTScjdjHMPOVrN952QJ2Z8Y2cZ5F9W6tij4k,4800
-setuptools-6.0.2.dist-info/RECORD,,
-setuptools-6.0.2.dist-info/top_level.txt,sha256=7780fzudMJkykiTcIrAQ8m8Lll6kot3EEePye3VJgEE,49
-setuptools-6.0.2.dist-info/WHEEL,sha256=56WjMPRUEpmb30QaTzVbQCpri5lzKGby5HLDkAMQeIU,116
-setuptools-6.0.2.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
-_markerlib/markers.py,sha256=YuFp0-osufFIoqnzG3L0Z2fDCx4Vln3VUDeXJ2DA_1I,3979
-_markerlib/__init__.py,sha256=GSmhZqvAitLJHhSgtqqusfq2nJ_ClP3oy3Lm0uZLIsU,552
-/openmedialibrary/platform/Linux_i686/home/.local/bin/easy_install,sha256=7h7lc5DCAhnE08UwEm49wGymGDGdOcrkRdncTKYmXIQ,233
-/openmedialibrary/platform/Linux_i686/home/.local/bin/easy_install-3.4,sha256=7h7lc5DCAhnE08UwEm49wGymGDGdOcrkRdncTKYmXIQ,233
-setuptools/_vendor/packaging/__pycache__/__init__.cpython-34.pyc,,
-setuptools/__pycache__/__init__.cpython-34.pyc,,
-setuptools/command/__pycache__/egg_info.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_find_packages.cpython-34.pyc,,
-__pycache__/pkg_resources.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_dist_info.cpython-34.pyc,,
-setuptools/command/__pycache__/bdist_rpm.cpython-34.pyc,,
-setuptools/command/__pycache__/sdist.cpython-34.pyc,,
-setuptools/command/__pycache__/rotate.cpython-34.pyc,,
-setuptools/__pycache__/version.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_packageindex.cpython-34.pyc,,
-setuptools/command/__pycache__/install.cpython-34.pyc,,
-setuptools/__pycache__/ssl_support.cpython-34.pyc,,
-setuptools/tests/__pycache__/environment.cpython-34.pyc,,
-__pycache__/easy_install.cpython-34.pyc,,
-setuptools/_vendor/packaging/__pycache__/__about__.cpython-34.pyc,,
-setuptools/__pycache__/dist.cpython-34.pyc,,
-setuptools/command/__pycache__/upload_docs.cpython-34.pyc,,
-setuptools/tests/__pycache__/py26compat.cpython-34.pyc,,
-setuptools/command/__pycache__/saveopts.cpython-34.pyc,,
-setuptools/__pycache__/svn_utils.cpython-34.pyc,,
-setuptools/command/__pycache__/register.cpython-34.pyc,,
-setuptools/_vendor/packaging/__pycache__/_structures.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_sandbox.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_build_ext.cpython-34.pyc,,
-setuptools/__pycache__/site-patch.cpython-34.pyc,,
-setuptools/command/__pycache__/bdist_wininst.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_resources.cpython-34.pyc,,
-setuptools/command/__pycache__/easy_install.cpython-34.pyc,,
-setuptools/__pycache__/py27compat.cpython-34.pyc,,
-setuptools/__pycache__/utils.cpython-34.pyc,,
-setuptools/command/__pycache__/build_ext.cpython-34.pyc,,
-setuptools/__pycache__/msvc9_support.cpython-34.pyc,,
-_markerlib/__pycache__/__init__.cpython-34.pyc,,
-setuptools/command/__pycache__/build_py.cpython-34.pyc,,
-setuptools/_vendor/__pycache__/__init__.cpython-34.pyc,,
-setuptools/command/__pycache__/bdist_egg.cpython-34.pyc,,
-setuptools/__pycache__/extension.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_egg_info.cpython-34.pyc,,
-_markerlib/__pycache__/markers.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_easy_install.cpython-34.pyc,,
-setuptools/__pycache__/depends.cpython-34.pyc,,
-setuptools/command/__pycache__/install_scripts.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_svn.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_test.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_develop.cpython-34.pyc,,
-setuptools/tests/__pycache__/script-with-bom.cpython-34.pyc,,
-setuptools/command/__pycache__/test.cpython-34.pyc,,
-setuptools/command/__pycache__/alias.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_upload_docs.cpython-34.pyc,,
-setuptools/command/__pycache__/develop.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_integration.cpython-34.pyc,,
-setuptools/command/__pycache__/setopt.cpython-34.pyc,,
-setuptools/__pycache__/archive_util.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_bdist_egg.cpython-34.pyc,,
-setuptools/__pycache__/unicode_utils.cpython-34.pyc,,
-setuptools/__pycache__/py31compat.cpython-34.pyc,,
-setuptools/_vendor/packaging/__pycache__/version.cpython-34.pyc,,
-setuptools/__pycache__/lib2to3_ex.cpython-34.pyc,,
-setuptools/_vendor/packaging/__pycache__/_compat.cpython-34.pyc,,
-setuptools/command/__pycache__/__init__.cpython-34.pyc,,
-setuptools/command/__pycache__/install_lib.cpython-34.pyc,,
-setuptools/tests/__pycache__/__init__.cpython-34.pyc,,
-setuptools/__pycache__/py26compat.cpython-34.pyc,,
-setuptools/tests/__pycache__/server.cpython-34.pyc,,
-setuptools/command/__pycache__/install_egg_info.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_msvc9compiler.cpython-34.pyc,,
-setuptools/__pycache__/sandbox.cpython-34.pyc,,
-setuptools/__pycache__/compat.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_markerlib.cpython-34.pyc,,
-setuptools/tests/__pycache__/test_sdist.cpython-34.pyc,,
-setuptools/__pycache__/package_index.cpython-34.pyc,,
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/metadata.json b/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/metadata.json
deleted file mode 100644
index 6d64ebe..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/metadata.json
+++ /dev/null
@@ -1 +0,0 @@
-{"keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "name": "setuptools", "classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Python Software Foundation License", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.1", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "extensions": {"python.exports": {"distutils.setup_keywords": {"test_loader": "setuptools.dist:check_importable", "dependency_links": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "extras_require": "setuptools.dist:check_extras", "namespace_packages": "setuptools.dist:check_nsp", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "include_package_data": "setuptools.dist:assert_bool", "package_data": "setuptools.dist:check_package_data", "install_requires": "setuptools.dist:check_requirements", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "test_runner": "setuptools.dist:check_importable", "packages": "setuptools.dist:check_packages", "test_suite": "setuptools.dist:check_test_suite", "convert_2to3_doctests": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool", "exclude_package_data": "setuptools.dist:check_package_data", "tests_require": "setuptools.dist:check_requirements", "setup_requires": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool"}, "distutils.commands": {"easy_install": "setuptools.command.easy_install:easy_install", "develop": "setuptools.command.develop:develop", "rotate": "setuptools.command.rotate:rotate", "install": "setuptools.command.install:install", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "build_py": "setuptools.command.build_py:build_py", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "build_ext": "setuptools.command.build_ext:build_ext", "register": "setuptools.command.register:register", "upload_docs": "setuptools.command.upload_docs:upload_docs", "alias": "setuptools.command.alias:alias", "setopt": "setuptools.command.setopt:setopt", "saveopts": "setuptools.command.saveopts:saveopts", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "install_scripts": "setuptools.command.install_scripts:install_scripts", "test": "setuptools.command.test:test", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "sdist": "setuptools.command.sdist:sdist", "egg_info": "setuptools.command.egg_info:egg_info", "install_lib": "setuptools.command.install_lib:install_lib"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}, "egg_info.writers": {"requires.txt": "setuptools.command.egg_info:write_requirements", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg"}, "console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.4": "setuptools.command.easy_install:main"}, "setuptools.file_finders": {"svn_cvs": "setuptools.command.sdist:_default_revctrl"}}, "python.details": {"project_urls": {"Home": "https://bitbucket.org/pypa/setuptools"}, "contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}}, "python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.4": "setuptools.command.easy_install:main"}}}, "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "test_requires": [{"requires": ["setuptools[ssl]", "pytest"]}], "run_requires": [{"extra": "certs", "requires": ["certifi (==1.0.1)"]}, {"extra": "ssl", "requires": ["wincertstore (==0.2)"], "environment": "sys_platform=='win32'"}], "license": "PSF or ZPL", "extras": ["certs", "ssl"], "generator": "bdist_wheel (0.24.0)", "version": "6.0.2", "metadata_version": "2.0"}
\ No newline at end of file
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/zip-safe b/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/zip-safe
deleted file mode 100644
index d3f5a12..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/zip-safe
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/__init__.py b/Linux_i686/lib/python3.4/site-packages/setuptools/__init__.py
index d99ab2a..712ec08 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/__init__.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/__init__.py
@@ -1,7 +1,7 @@
 """Extensions to the 'distutils' for large or complex distributions"""
 
 import os
-import sys
+import functools
 import distutils.core
 import distutils.filelist
 from distutils.core import Command as _Command
@@ -74,21 +74,24 @@ class PackageFinder(object):
             yield pkg
 
     @staticmethod
-    def _all_dirs(base_path):
+    def _candidate_dirs(base_path):
         """
-        Return all dirs in base_path, relative to base_path
+        Return all dirs in base_path that might be packages.
         """
+        has_dot = lambda name: '.' in name
         for root, dirs, files in os.walk(base_path, followlinks=True):
+            # Exclude directories that contain a period, as they cannot be
+            #  packages. Mutate the list to avoid traversal.
+            dirs[:] = filterfalse(has_dot, dirs)
             for dir in dirs:
                 yield os.path.relpath(os.path.join(root, dir), base_path)
 
     @classmethod
     def _find_packages_iter(cls, base_path):
-        dirs = cls._all_dirs(base_path)
-        suitable = filterfalse(lambda n: '.' in n, dirs)
+        candidates = cls._candidate_dirs(base_path)
         return (
             path.replace(os.path.sep, '.')
-            for path in suitable
+            for path in candidates
             if cls._looks_like_package(os.path.join(base_path, path))
         )
 
@@ -121,34 +124,45 @@ class Command(_Command):
     command_consumes_arguments = False
 
     def __init__(self, dist, **kw):
-        # Add support for keyword arguments
-        _Command.__init__(self,dist)
-        for k,v in kw.items():
-            setattr(self,k,v)
+        """
+        Construct the command for dist, updating
+        vars(self) with any keyword parameters.
+        """
+        _Command.__init__(self, dist)
+        vars(self).update(kw)
 
     def reinitialize_command(self, command, reinit_subcommands=0, **kw):
         cmd = _Command.reinitialize_command(self, command, reinit_subcommands)
-        for k,v in kw.items():
-            setattr(cmd,k,v)    # update command with keywords
+        vars(cmd).update(kw)
         return cmd
 
-distutils.core.Command = Command    # we can't patch distutils.cmd, alas
+# we can't patch distutils.cmd, alas
+distutils.core.Command = Command
 
-def findall(dir = os.curdir):
-    """Find all files under 'dir' and return the list of full filenames
-    (relative to 'dir').
+
+def _find_all_simple(path):
     """
-    all_files = []
-    for base, dirs, files in os.walk(dir):
-        if base==os.curdir or base.startswith(os.curdir+os.sep):
-            base = base[2:]
-        if base:
-            files = [os.path.join(base, f) for f in files]
-        all_files.extend(filter(os.path.isfile, files))
-    return all_files
+    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)
 
-distutils.filelist.findall = findall    # fix findall bug in distutils.
 
-# sys.dont_write_bytecode was introduced in Python 2.6.
-_dont_write_bytecode = getattr(sys, 'dont_write_bytecode',
-    bool(os.environ.get("PYTHONDONTWRITEBYTECODE")))
+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)
+
+
+# fix findall bug in distutils (http://bugs.python.org/issue12885)
+distutils.filelist.findall = findall
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/version.py b/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/version.py
deleted file mode 100644
index 0affe89..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/_vendor/packaging/version.py
+++ /dev/null
@@ -1,786 +0,0 @@
-# Copyright 2014 Donald Stufft
-#
-# 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.
-from __future__ import absolute_import, division, print_function
-
-import collections
-import itertools
-import re
-
-from ._compat import string_types
-from ._structures import Infinity
-
-
-__all__ = [
-    "parse", "Version", "LegacyVersion", "InvalidVersion", "Specifier",
-    "InvalidSpecifier",
-]
-
-
-_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 "".format(repr(str(self)))
-
-    @property
-    def public(self):
-        return self._version
-
-    @property
-    def local(self):
-        return None
-
-    @property
-    def is_prerelease(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
-
-
-class Version(_BaseVersion):
-
-    _regex = re.compile(
-        r"""
-        ^
-        \s*
-        v?
-        (?:
-            (?:(?P[0-9]+)!)?                           # epoch
-            (?P[0-9]+(?:\.[0-9]+)*)                  # release segment
-            (?P
                                          # pre-release
-                [-_\.]?
-                (?P(a|b|c|rc|alpha|beta|pre|preview))
-                [-_\.]?
-                (?P[0-9]+)?
-            )?
-            (?P                                         # post release
-                (?:-(?P[0-9]+))
-                |
-                (?:
-                    [-_\.]?
-                    (?Ppost|rev|r)
-                    [-_\.]?
-                    (?P[0-9]+)?
-                )
-            )?
-            (?P                                          # dev release
-                [-_\.]?
-                (?Pdev)
-                [-_\.]?
-                (?P[0-9]+)?
-            )?
-        )
-        (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
-        \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 "".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 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)
-
-
-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 ["rc", "pre", "preview"]:
-            letter = "c"
-
-        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
-
-
-class InvalidSpecifier(ValueError):
-    """
-    An invalid specifier was found, users should refer to PEP 440.
-    """
-
-
-class Specifier(object):
-
-    _regex = re.compile(
-        r"""
-        ^
-        \s*
-        (?P(~=|==|!=|<=|>=|<|>|===))
-        (?P
-            (?:
-                # 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.
-                (?=": "greater_than_equal",
-        "<": "less_than",
-        ">": "greater_than",
-        "===": "arbitrary",
-    }
-
-    def __init__(self, specs="", prereleases=None):
-        # Split on comma to get each individual specification
-        _specs = set()
-        for spec in (s for s in specs.split(",") if s):
-            match = self._regex.search(spec)
-            if not match:
-                raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec))
-
-            _specs.add(
-                (
-                    match.group("operator").strip(),
-                    match.group("version").strip(),
-                )
-            )
-
-        # Set a frozen set for our specifications
-        self._specs = frozenset(_specs)
-
-        # Store whether or not this Specifier should accept prereleases
-        self._prereleases = prereleases
-
-    def __repr__(self):
-        return "".format(repr(str(self)))
-
-    def __str__(self):
-        return ",".join(["".join(s) for s in sorted(self._specs)])
-
-    def __hash__(self):
-        return hash(self._specs)
-
-    def __and__(self, other):
-        if isinstance(other, string_types):
-            other = Specifier(other)
-        elif not isinstance(other, Specifier):
-            return NotImplemented
-
-        return self.__class__(",".join([str(self), str(other)]))
-
-    def __eq__(self, other):
-        if isinstance(other, string_types):
-            other = Specifier(other)
-        elif not isinstance(other, Specifier):
-            return NotImplemented
-
-        return self._specs == other._specs
-
-    def __ne__(self, other):
-        if isinstance(other, string_types):
-            other = Specifier(other)
-        elif not isinstance(other, Specifier):
-            return NotImplemented
-
-        return self._specs != other._specs
-
-    def _get_operator(self, op):
-        return getattr(self, "_compare_{0}".format(self._operators[op]))
-
-    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))
-
-    def _compare_equal(self, prospective, spec):
-        # We need special logic to handle prefix matching
-        if spec.endswith(".*"):
-            # 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
-
-    def _compare_not_equal(self, prospective, spec):
-        return not self._compare_equal(prospective, spec)
-
-    def _compare_less_than_equal(self, prospective, spec):
-        return prospective <= Version(spec)
-
-    def _compare_greater_than_equal(self, prospective, spec):
-        return prospective >= Version(spec)
-
-    def _compare_less_than(self, prospective, spec):
-        # Less than are defined as exclusive operators, this implies that
-        # pre-releases do not match for the same series as the spec. This is
-        # implemented by making V imply !=V.*.
-        return (prospective > Version(spec)
-                and self._get_operator("!=")(prospective, spec + ".*"))
-
-    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.
-        for spec, version in self._specs:
-            if spec in ["==", ">=", "<=", "~="]:
-                # The == specifier can include a trailing .*, if it does we
-                # want to remove before parsing.
-                if spec == "==" 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
-
-    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")
-        if isinstance(item, (Version, LegacyVersion)):
-            version_item = item
-        else:
-            try:
-                version_item = Version(item)
-            except ValueError:
-                version_item = LegacyVersion(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 version_item.is_prerelease and not prereleases:
-            return False
-
-        # Detect if we have any specifiers, if we do not then anything matches
-        # and we can short circuit all this logic.
-        if not self._specs:
-            return True
-
-        # If we're operating on a LegacyVersion, then we can only support
-        # arbitrary comparison so do a quick check to see if the spec contains
-        # any non arbitrary specifiers
-        if isinstance(version_item, LegacyVersion):
-            if any(op != "===" for op, _ in self._specs):
-                return False
-
-        # Ensure that the passed in version matches all of our version
-        # specifiers
-        return all(
-            self._get_operator(op)(
-                version_item if op != "===" else item,
-                spec,
-            )
-            for op, spec, in self._specs
-        )
-
-    def filter(self, iterable, prereleases=None):
-        iterable = list(iterable)
-        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:
-            if not isinstance(version, (Version, LegacyVersion)):
-                parsed_version = parse(version)
-            else:
-                parsed_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
-
-
-_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):])
-    right_split.append(left[len(right_split):])
-
-    # 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)),
-    )
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/archive_util.py b/Linux_i686/lib/python3.4/site-packages/setuptools/archive_util.py
index 67a67e2..b3c9fa5 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/archive_util.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/archive_util.py
@@ -64,20 +64,23 @@ def unpack_directory(filename, extract_dir, progress_filter=default_filter):
     Raises ``UnrecognizedFormat`` if `filename` is not a directory
     """
     if not os.path.isdir(filename):
-        raise UnrecognizedFormat("%s is not a directory" % (filename,))
+        raise UnrecognizedFormat("%s is not a directory" % filename)
 
-    paths = {filename:('',extract_dir)}
+    paths = {
+        filename: ('', extract_dir),
+    }
     for base, dirs, files in os.walk(filename):
-        src,dst = paths[base]
+        src, dst = paths[base]
         for d in dirs:
-            paths[os.path.join(base,d)] = src+d+'/', os.path.join(dst,d)
+            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)
+            target = os.path.join(dst, f)
+            target = progress_filter(src + f, target)
             if not target:
-                continue    # skip non-files
+                # skip non-files
+                continue
             ensure_directory(target)
-            f = os.path.join(base,f)
+            f = os.path.join(base, f)
             shutil.copyfile(f, target)
             shutil.copystat(f, target)
 
@@ -112,12 +115,8 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter):
                 # file
                 ensure_directory(target)
                 data = z.read(info.filename)
-                f = open(target,'wb')
-                try:
+                with open(target, 'wb') as f:
                     f.write(data)
-                finally:
-                    f.close()
-                    del data
             unix_attributes = info.external_attr >> 16
             if unix_attributes:
                 os.chmod(target, unix_attributes)
@@ -137,18 +136,21 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
             "%s is not a compressed or uncompressed tar file" % (filename,)
         )
     with contextlib.closing(tarobj):
-        tarobj.chown = lambda *args: None   # don't do any chowning!
+        # 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
+                # 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():
-                        linkpath = posixpath.join(posixpath.dirname(member.name), linkpath)
+                        base = posixpath.dirname(member.name)
+                        linkpath = posixpath.join(base, linkpath)
                         linkpath = posixpath.normpath(linkpath)
                     member = tarobj._getmember(linkpath)
 
@@ -158,9 +160,11 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
                         if final_dst.endswith(os.sep):
                             final_dst = final_dst[:-1]
                         try:
-                            tarobj._extract_member(member, final_dst)  # XXX Ugh
+                            # XXX Ugh
+                            tarobj._extract_member(member, final_dst)
                         except tarfile.ExtractError:
-                            pass    # chown/chmod/mkfifo/mknode/makedev failed
+                            # chown/chmod/mkfifo/mknode/makedev failed
+                            pass
         return True
 
 extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/cli-32.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/cli-32.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/cli-64.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/cli-64.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/cli-arm-32.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/cli-arm-32.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/cli.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/cli.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/bdist_egg.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/bdist_egg.py
index 34fdeec..87dce88 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/bdist_egg.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/bdist_egg.py
@@ -2,7 +2,6 @@
 
 Build .egg distributions"""
 
-# This module should be kept compatible with Python 2.3
 from distutils.errors import DistutilsSetupError
 from distutils.dir_util import remove_tree, mkpath
 from distutils import log
@@ -406,10 +405,6 @@ def scan_module(egg_dir, base, name, stubs):
             if bad in symbols:
                 log.warn("%s: module MAY be using inspect.%s", module, bad)
                 safe = False
-    if '__name__' in symbols and '__main__' in symbols and '.' not in module:
-        if sys.version[:3] == "2.4":  # -m works w/zipfiles in 2.5
-            log.warn("%s: top-level module may be 'python -m' script", module)
-            safe = False
     return safe
 
 
@@ -441,7 +436,7 @@ INSTALL_DIRECTORY_ATTRS = [
 ]
 
 
-def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None,
+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"
@@ -463,11 +458,7 @@ def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=None,
                     z.write(path, p)
                 log.debug("adding '%s'" % p)
 
-    if compress is None:
-        # avoid 2.3 zipimport bug when 64 bits
-        compress = (sys.version >= "2.4")
-
-    compression = [zipfile.ZIP_STORED, zipfile.ZIP_DEFLATED][bool(compress)]
+    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 os.walk(base_dir):
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_ext.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_ext.py
index 53bf9cd..92e4a18 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_ext.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_ext.py
@@ -6,12 +6,13 @@ from distutils.errors import DistutilsError
 from distutils import log
 import os
 import sys
+import itertools
 
 from setuptools.extension import Library
 
 try:
-    # Attempt to use Pyrex for building extensions, if available
-    from Pyrex.Distutils.build_ext import build_ext as _build_ext
+    # Attempt to use Cython for building extensions, if available
+    from Cython.Distutils.build_ext import build_ext as _build_ext
 except ImportError:
     _build_ext = _du_build_ext
 
@@ -33,19 +34,13 @@ if sys.platform == "darwin":
     use_stubs = True
 elif os.name != 'nt':
     try:
-        from dl import RTLD_NOW
-
-        have_rtld = True
-        use_stubs = True
+        import dl
+        use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW')
     except ImportError:
         pass
 
 
-def if_dl(s):
-    if have_rtld:
-        return s
-    return ''
-
+if_dl = lambda s: s if have_rtld else ''
 
 class build_ext(_build_ext):
     def run(self):
@@ -78,15 +73,6 @@ class build_ext(_build_ext):
             if ext._needs_stub:
                 self.write_stub(package_dir or os.curdir, ext, True)
 
-    if _build_ext is not _du_build_ext and not hasattr(_build_ext,
-                                                       'pyrex_sources'):
-        # Workaround for problems using some Pyrex versions w/SWIG and/or 2.4
-        def swig_sources(self, sources, *otherargs):
-            # first do any Pyrex processing
-            sources = _build_ext.swig_sources(self, sources) or sources
-            # Then do any actual SWIG stuff on the remainder
-            return _du_build_ext.swig_sources(self, sources, *otherargs)
-
     def get_ext_filename(self, fullname):
         filename = _build_ext.get_ext_filename(self, fullname)
         if fullname in self.ext_map:
@@ -123,10 +109,10 @@ class build_ext(_build_ext):
             # XXX what to do with conflicts?
             self.ext_map[fullname.split('.')[-1]] = ext
 
-            ltd = ext._links_to_dynamic = \
-                self.shlibs and self.links_to_dynamic(ext) or False
-            ext._needs_stub = ltd and use_stubs and not isinstance(ext,
-                                                                   Library)
+            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:
@@ -180,15 +166,15 @@ class build_ext(_build_ext):
         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:
-                self.write_stub(
-                    self.get_finalized_command('build_py').build_lib, ext
-                )
+                cmd = self.get_finalized_command('build_py').build_lib
+                self.write_stub(cmd, ext)
         finally:
             self.compiler = _compiler
 
@@ -199,22 +185,27 @@ class build_ext(_build_ext):
         # XXX static-compiled version
         libnames = dict.fromkeys([lib._full_name for lib in self.shlibs])
         pkg = '.'.join(ext._full_name.split('.')[:-1] + [''])
-        for libname in ext.libraries:
-            if pkg + libname in libnames:
-                return True
-        return False
+        return any(pkg + libname in libnames for libname in ext.libraries)
 
     def get_outputs(self):
-        outputs = _build_ext.get_outputs(self)
-        optimize = self.get_finalized_command('build_py').optimize
-        for ext in self.extensions:
-            if ext._needs_stub:
-                base = os.path.join(self.build_lib, *ext._full_name.split('.'))
-                outputs.append(base + '.py')
-                outputs.append(base + '.pyc')
-                if optimize:
-                    outputs.append(base + '.pyo')
-        return outputs
+        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,
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_py.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_py.py
index 9808069..a873d54 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_py.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/build_py.py
@@ -136,22 +136,7 @@ class build_py(orig.build_py, Mixin2to3):
                 mf.setdefault(src_dirs[d], []).append(path)
 
     def get_data_files(self):
-        pass  # kludge 2.4 for lazy computation
-
-    if sys.version < "2.4":  # Python 2.4 already has this code
-        def get_outputs(self, include_bytecode=1):
-            """Return complete list of files copied to the build directory
-
-            This includes both '.py' files and data files, as well as '.pyc'
-            and '.pyo' files if 'include_bytecode' is true.  (This method is
-            needed for the 'install_lib' command to do its job properly, and to
-            generate a correct installation manifest.)
-            """
-            return orig.build_py.get_outputs(self, include_bytecode) + [
-                os.path.join(build_dir, filename)
-                for package, src_dir, build_dir, filenames in self.data_files
-                for filename in filenames
-            ]
+        pass  # Lazily compute data files in _get_data_files() function.
 
     def check_package(self, package, package_dir):
         """Check namespace packages' __init__ for declare_namespace"""
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/develop.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/develop.py
index 368b64f..5ae25d7 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/develop.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/develop.py
@@ -167,3 +167,30 @@ class develop(easy_install):
             script_text = f.read()
             f.close()
             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(object):
+    """
+    Adapt a pkg_resources.Distribution to simply return the project
+    name as the 'requirement' so that scripts will work across
+    multiple versions.
+
+    >>> 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/Linux_i686/lib/python3.4/site-packages/setuptools/command/easy_install.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/easy_install.py
index 6854827..4fae256 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/easy_install.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/easy_install.py
@@ -34,8 +34,12 @@ import textwrap
 import warnings
 import site
 import struct
+import contextlib
+import subprocess
+import shlex
+import io
 
-from setuptools import Command, _dont_write_bytecode
+from setuptools import Command
 from setuptools.sandbox import run_setup
 from setuptools.py31compat import get_path, get_config_vars
 from setuptools.command import setopt
@@ -53,9 +57,9 @@ from pkg_resources import (
 )
 import pkg_resources
 
+# Turn on PEP440Warnings
+warnings.filterwarnings("default", category=pkg_resources.PEP440Warning)
 
-sys_executable = os.environ.get('__PYVENV_LAUNCHER__',
-                                os.path.normpath(sys.executable))
 
 __all__ = [
     'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg',
@@ -148,12 +152,9 @@ class easy_install(Command):
     create_index = PackageIndex
 
     def initialize_options(self):
-        if site.ENABLE_USER_SITE:
-            whereami = os.path.abspath(__file__)
-            self.user = whereami.startswith(site.USER_SITE)
-        else:
-            self.user = 0
-
+        # 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
@@ -199,20 +200,34 @@ class easy_install(Command):
         )
 
     def delete_blockers(self, blockers):
-        for filename in blockers:
-            if os.path.exists(filename) or os.path.islink(filename):
-                log.info("Deleting %s", filename)
-                if not self.dry_run:
-                    if (os.path.isdir(filename) and
-                            not os.path.islink(filename)):
-                        rmtree(filename)
-                    else:
-                        os.unlink(filename)
+        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):
-        if self.version:
-            print('setuptools %s' % get_distribution('setuptools').version)
-            sys.exit()
+        self.version and self._render_version()
 
         py_version = sys.version.split()[0]
         prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix')
@@ -236,18 +251,7 @@ class easy_install(Command):
             self.config_vars['userbase'] = self.install_userbase
             self.config_vars['usersite'] = self.install_usersite
 
-        # fix the install_dir if "--user" was used
-        # XXX: duplicate of the code in the setup command
-        if self.user and site.ENABLE_USER_SITE:
-            self.create_home_path()
-            if self.install_userbase is None:
-                raise DistutilsPlatformError(
-                    "User base directory is not specified")
-            self.install_base = self.install_platbase = self.install_userbase
-            if os.name == 'posix':
-                self.select_scheme("unix_user")
-            else:
-                self.select_scheme(os.name + "_user")
+        self._fix_install_dir_for_user_site()
 
         self.expand_basedirs()
         self.expand_dirs()
@@ -342,6 +346,21 @@ class easy_install(Command):
 
         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)
@@ -434,7 +453,7 @@ class easy_install(Command):
             self.pth_file = None
 
         PYTHONPATH = os.environ.get('PYTHONPATH', '').split(os.pathsep)
-        if instdir not in map(normalize_path, [_f for _f in PYTHONPATH if _f]):
+        if instdir not in map(normalize_path, filter(None, 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):
@@ -442,43 +461,49 @@ class easy_install(Command):
             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://pythonhosted.org/setuptools/easy_install.html
+
+        Please make the appropriate changes for your system and try again.
+        """).lstrip()
+
     def cant_write_to_target(self):
-        template = """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
-"""
-        msg = template % (sys.exc_info()[1], self.install_dir,)
+        msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,)
 
         if not os.path.exists(self.install_dir):
-            msg += """
-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).
-"""
+            msg += '\n' + self.__not_exists_id
         else:
-            msg += """
-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://pythonhosted.org/setuptools/easy_install.html
-
-Please make the appropriate changes for your system and try again.
-"""
+            msg += '\n' + self.__access_msg
         raise DistutilsError(msg)
 
     def check_pth_processing(self):
@@ -692,17 +717,10 @@ Please make the appropriate changes for your system and try again.
             distros = WorkingSet([]).resolve(
                 [requirement], self.local_index, self.easy_install
             )
-        except DistributionNotFound:
-            e = sys.exc_info()[1]
-            raise DistutilsError(
-                "Could not find required distribution %s" % e.args
-            )
-        except VersionConflict:
-            e = sys.exc_info()[1]
-            raise DistutilsError(
-                "Installed distribution %s conflicts with requirement %s"
-                % e.args
-            )
+        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:
@@ -742,9 +760,10 @@ Please make the appropriate changes for your system and try again.
         return dst
 
     def install_wrapper_scripts(self, dist):
-        if not self.exclude_scripts:
-            for args in get_script_args(dist):
-                self.write_script(*args)
+        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"""
@@ -752,7 +771,7 @@ Please make the appropriate changes for your system and try again.
         is_script = is_python_script(script_text, script_name)
 
         if is_script:
-            script_text = (get_script_header(script_text) +
+            script_text = (ScriptWriter.get_header(script_text) +
                            self._load_template(dev_path) % locals())
         self.write_script(script_name, _to_ascii(script_text), 'b')
 
@@ -916,9 +935,10 @@ Please make the appropriate changes for your system and try again.
                     f.write('%s: %s\n' % (k.replace('_', '-').title(), v))
             f.close()
         script_dir = os.path.join(_egg_info, 'scripts')
-        self.delete_blockers(  # delete entry-point scripts to avoid duping
+        # delete entry-point scripts to avoid duping
+        self.delete_blockers(
             [os.path.join(script_dir, args[0]) for args in
-             get_script_args(dist)]
+             ScriptWriter.get_args(dist)]
         )
         # Build .egg file from tmpdir
         bdist_egg.make_zipfile(
@@ -980,46 +1000,52 @@ Please make the appropriate changes for your system and try again.
                     f.write('\n'.join(locals()[name]) + '\n')
                     f.close()
 
+    __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 += """
-
-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
-"""
+            msg += '\n' + self.__mv_warning
             if self.install_dir not in map(normalize_path, sys.path):
-                msg += """
+                msg += '\n' + self.__id_warning
 
-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.)
-"""
         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 """\nExtracted 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.
-""" % locals()
+        return '\n' + self.__editable_msg % locals()
 
     def run_setup(self, setup_script, setup_base, args):
         sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg)
@@ -1038,8 +1064,7 @@ See the setuptools documentation for the "develop" command for more info.
         )
         try:
             run_setup(setup_script, args)
-        except SystemExit:
-            v = sys.exc_info()[1]
+        except SystemExit as v:
             raise DistutilsError("Setup script exited with %s" % (v.args[0],))
 
     def build_and_install(self, setup_script, setup_base):
@@ -1152,7 +1177,7 @@ See the setuptools documentation for the "develop" command for more info.
                 chmod(f, mode)
 
     def byte_compile(self, to_compile):
-        if _dont_write_bytecode:
+        if sys.dont_write_bytecode:
             self.warn('byte-compiling is disabled, skipping.')
             return
 
@@ -1171,35 +1196,38 @@ See the setuptools documentation for the "develop" command for more info.
         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://pythonhosted.org/setuptools/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 = """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://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations
-
-Please make the appropriate changes for your system and try again."""
+        template = self.__no_default_msg
         return template % (self.install_dir, os.environ.get('PYTHONPATH', ''))
 
     def install_site_py(self):
@@ -1399,13 +1427,8 @@ def extract_wininst_cfg(dist_filename):
             {'version': '', 'target_version': ''})
         try:
             part = f.read(cfglen)
-            # part is in bytes, but we need to read up to the first null
-            # byte.
-            if sys.version_info >= (2, 6):
-                null_byte = bytes([0])
-            else:
-                null_byte = chr(0)
-            config = part.split(null_byte, 1)[0]
+            # 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())
@@ -1517,23 +1540,16 @@ class PthDistributions(Environment):
         if not self.dirty:
             return
 
-        data = '\n'.join(map(self.make_relative, self.paths))
-        if data:
+        rel_paths = list(map(self.make_relative, self.paths))
+        if rel_paths:
             log.debug("Saving %s", self.filename)
-            data = (
-                "import sys; sys.__plen = len(sys.path)\n"
-                "%s\n"
-                "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)\n"
-            ) % data
+            lines = self._wrap_lines(rel_paths)
+            data = '\n'.join(lines) + '\n'
 
             if os.path.islink(self.filename):
                 os.unlink(self.filename)
-            f = open(self.filename, 'wt')
-            f.write(data)
-            f.close()
+            with open(self.filename, 'wt') as f:
+                f.write(data)
 
         elif os.path.exists(self.filename):
             log.debug("Deleting empty %s", self.filename)
@@ -1541,12 +1557,20 @@ class PthDistributions(Environment):
 
         self.dirty = False
 
+    @staticmethod
+    def _wrap_lines(lines):
+        return lines
+
     def add(self, dist):
         """Add `dist` to the distribution map"""
-        if (dist.location not in self.paths and (
-            dist.location not in self.sitedirs or
-            dist.location == os.getcwd()  # account for '.' being in PYTHONPATH
-        )):
+        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)
@@ -1574,6 +1598,34 @@ class PthDistributions(Environment):
             return path
 
 
+class RewritePthDistributions(PthDistributions):
+
+    @classmethod
+    def _wrap_lines(cls, lines):
+        yield cls.prelude
+        for line in lines:
+            yield line
+        yield cls.postlude
+
+    _inline = lambda text: textwrap.dedent(text).strip().replace('\n', '; ')
+    prelude = _inline("""
+        import sys
+        sys.__plen = len(sys.path)
+        """)
+    postlude = _inline("""
+        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', 'rewrite') == 'rewrite':
+    PthDistributions = RewritePthDistributions
+
+
 def _first_line_re():
     """
     Return a regular expression based on first_line_re suitable for matching
@@ -1586,33 +1638,6 @@ def _first_line_re():
     return re.compile(first_line_re.pattern.decode())
 
 
-def get_script_header(script_text, executable=sys_executable, wininst=False):
-    """Create a #! line, getting options (if any) from script_text"""
-    first = (script_text + '\n').splitlines()[0]
-    match = _first_line_re().match(first)
-    options = ''
-    if match:
-        options = match.group(1) or ''
-        if options:
-            options = ' ' + options
-    if wininst:
-        executable = "python.exe"
-    else:
-        executable = nt_quote_arg(executable)
-    hdr = "#!%(executable)s%(options)s\n" % locals()
-    if not isascii(hdr):
-        # Non-ascii path to sys.executable, use -x to prevent warnings
-        if options:
-            if options.strip().startswith('-'):
-                options = ' -x' + options.strip()[1:]
-                # else: punt, we can't do it, let the warning happen anyway
-        else:
-            options = ' -x'
-    executable = fix_jython_executable(executable, options)
-    hdr = "#!%(executable)s%(options)s\n" % locals()
-    return hdr
-
-
 def auto_chmod(func, arg, exc):
     if func is os.remove and os.name == 'nt':
         chmod(arg, stat.S_IWRITE)
@@ -1811,9 +1836,8 @@ def is_python(text, filename=''):
 def is_sh(executable):
     """Determine if the specified executable is a .sh (contains a #! line)"""
     try:
-        fp = open(executable)
-        magic = fp.read(2)
-        fp.close()
+        with io.open(executable, encoding='latin-1') as fp:
+            magic = fp.read(2)
     except (OSError, IOError):
         return executable
     return magic == '#!'
@@ -1821,36 +1845,7 @@ def is_sh(executable):
 
 def nt_quote_arg(arg):
     """Quote a command line argument according to Windows parsing rules"""
-
-    result = []
-    needquote = False
-    nb = 0
-
-    needquote = (" " in arg) or ("\t" in arg)
-    if needquote:
-        result.append('"')
-
-    for c in arg:
-        if c == '\\':
-            nb += 1
-        elif c == '"':
-            # double preceding backslashes, then add a \"
-            result.append('\\' * (nb * 2) + '\\"')
-            nb = 0
-        else:
-            if nb:
-                result.append('\\' * nb)
-                nb = 0
-            result.append(c)
-
-    if nb:
-        result.append('\\' * nb)
-
-    if needquote:
-        result.append('\\' * nb)  # double the trailing backslashes
-        result.append('"')
-
-    return ''.join(result)
+    return subprocess.list2cmdline([arg])
 
 
 def is_python_script(script_text, filename):
@@ -1879,31 +1874,130 @@ def chmod(path, mode):
     log.debug("changing mode of %s to %o", path, mode)
     try:
         _chmod(path, mode)
-    except os.error:
-        e = sys.exc_info()[1]
+    except os.error as e:
         log.debug("chmod failed: %s", e)
 
 
 def fix_jython_executable(executable, options):
-    if sys.platform.startswith('java') and is_sh(executable):
-        # Workaround for Jython is not needed on Linux systems.
-        import java
+    warnings.warn("Use JythonCommandSpec", DeprecationWarning, stacklevel=2)
 
-        if java.lang.System.getProperty("os.name") == "Linux":
-            return executable
+    if not JythonCommandSpec.relevant():
+        return executable
 
-        # Workaround Jython's sys.executable being a .sh (an invalid
-        # shebang line interpreter)
-        if options:
+    cmd = CommandSpec.best().from_param(executable)
+    cmd.install_options(options)
+    return cmd.as_header().lstrip('#!').rstrip('\n')
+
+
+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 if not JythonCommandSpec.relevant() else JythonCommandSpec
+
+    @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 _render(items):
+        cmdline = subprocess.list2cmdline(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 JythonCommandSpec(CommandSpec):
+    @classmethod
+    def relevant(cls):
+        return (
+            sys.platform.startswith('java')
+            and
+            __import__('java').lang.System.getProperty('os.name') != 'Linux'
+        )
+
+    def as_header(self):
+        """
+        Workaround Jython's sys.executable being a .sh (an invalid
+        shebang line interpreter)
+        """
+        if not is_sh(self[0]):
+            return super(JythonCommandSpec, self).as_header()
+
+        if self.options:
             # Can't apply the workaround, leave it broken
             log.warn(
                 "WARNING: Unable to adapt shebang line for Jython,"
                 " the following script is NOT executable\n"
                 "         see http://bugs.jython.org/issue1112 for"
                 " more information.")
-        else:
-            return '/usr/bin/env %s' % executable
-    return executable
+            return super(JythonCommandSpec, self).as_header()
+
+        items = ['/usr/bin/env'] + self + list(self.options)
+        return self._render(items)
 
 
 class ScriptWriter(object):
@@ -1924,39 +2018,92 @@ class ScriptWriter(object):
             )
     """).lstrip()
 
+    command_spec_class = CommandSpec
+
     @classmethod
-    def get_script_args(cls, dist, executable=sys_executable, wininst=False):
+    def get_script_args(cls, dist, executable=None, wininst=False):
+        # for backward compatibility
+        warnings.warn("Use get_args", DeprecationWarning)
+        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", DeprecationWarning)
+        if wininst:
+            executable = "python.exe"
+        cmd = cls.command_spec_class.best().from_param(executable)
+        cmd.install_options(script_text)
+        return cmd.as_header()
+
+    @classmethod
+    def get_args(cls, dist, header=None):
         """
-        Yield write_script() argument tuples for a distribution's entrypoints
+        Yield write_script() argument tuples for a distribution's
+        console_scripts and gui_scripts entry points.
         """
-        gen_class = cls.get_writer(wininst)
+        if header is None:
+            header = cls.get_header()
         spec = str(dist.as_requirement())
-        header = get_script_header("", executable, wininst)
         for type_ in 'console', 'gui':
             group = type_ + '_scripts'
             for name, ep in dist.get_entry_map(group).items():
-                script_text = gen_class.template % locals()
-                for res in gen_class._get_script_args(type_, name, header,
-                                                      script_text):
+                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):
-        if force_windows or sys.platform == 'win32':
-            return WindowsScriptWriter.get_writer()
-        return cls
+        # for backward compatibility
+        warnings.warn("Use best", DeprecationWarning)
+        return WindowsScriptWriter.best() if force_windows else cls.best()
+
+    @classmethod
+    def best(cls):
+        """
+        Select the best ScriptWriter for this environment.
+        """
+        return WindowsScriptWriter.best() if sys.platform == 'win32' else 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", DeprecationWarning)
+        return cls.best()
+
+    @classmethod
+    def best(cls):
         """
-        Get a script writer suitable for Windows
+        Select the best ScriptWriter suitable for Windows
         """
         writer_lookup = dict(
             executable=WindowsExecutableLauncherWriter,
@@ -2031,6 +2178,7 @@ class WindowsExecutableLauncherWriter(WindowsScriptWriter):
 
 # for backward-compatibility
 get_script_args = ScriptWriter.get_script_args
+get_script_header = ScriptWriter.get_script_header
 
 
 def get_win_launcher(type):
@@ -2114,39 +2262,41 @@ def bootstrap():
 def main(argv=None, **kw):
     from setuptools import setup
     from setuptools.dist import Distribution
-    import distutils.core
 
-    USAGE = """\
-usage: %(script)s [options] requirement_or_url ...
-   or: %(script)s --help
-"""
+    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),
         )
 
-    def with_ei_usage(f):
-        old_gen_usage = distutils.core.gen_usage
-        try:
-            distutils.core.gen_usage = gen_usage
-            return f()
-        finally:
-            distutils.core.gen_usage = old_gen_usage
-
-    class DistributionWithoutHelpCommands(Distribution):
-        common_usage = ""
-
-        def _show_help(self, *args, **kw):
-            with_ei_usage(lambda: Distribution._show_help(self, *args, **kw))
-
-    if argv is None:
-        argv = sys.argv[1:]
-
-    with_ei_usage(
-        lambda: setup(
-            script_args=['-q', 'easy_install', '-v'] + argv,
-            script_name=sys.argv[0] or 'easy_install',
-            distclass=DistributionWithoutHelpCommands, **kw
-        )
-    )
+    saved = distutils.core.gen_usage
+    distutils.core.gen_usage = gen_usage
+    try:
+        yield
+    finally:
+        distutils.core.gen_usage = saved
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/egg_info.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/egg_info.py
index 06764a1..50f3d5c 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/egg_info.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/egg_info.py
@@ -6,20 +6,26 @@ from distutils.filelist import FileList as _FileList
 from distutils.util import convert_path
 from distutils import log
 import distutils.errors
+import distutils.filelist
 import os
 import re
 import sys
 
+try:
+    from setuptools_svn import svn_utils
+except ImportError:
+    pass
+
 from setuptools import Command
 from setuptools.command.sdist import sdist
 from setuptools.compat import basestring, PY3, StringIO
-from setuptools import svn_utils
 from setuptools.command.sdist import walk_revctrl
 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 pkg_resources import packaging
 
 class egg_info(Command):
     description = "create a distribution's .egg-info directory"
@@ -68,10 +74,15 @@ class egg_info(Command):
         self.vtags = self.tags()
         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('%s==%s' % (self.egg_name,
-                                               self.egg_version))
+                parse_requirements(spec % (self.egg_name, self.egg_version))
             )
         except ValueError:
             raise distutils.errors.DistutilsOptionError(
@@ -157,7 +168,8 @@ class egg_info(Command):
         self.mkpath(self.egg_info)
         installer = self.distribution.fetch_build_egg
         for ep in iter_entry_points('egg_info.writers'):
-            writer = ep.load(installer=installer)
+            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
@@ -183,6 +195,8 @@ class egg_info(Command):
 
     @staticmethod
     def get_svn_revision():
+        if 'svn_utils' not in globals():
+            return "0"
         return str(svn_utils.SvnInfo.load(os.curdir).get_revision())
 
     def find_sources(self):
@@ -312,8 +326,33 @@ class manifest_maker(sdist):
         elif os.path.exists(self.manifest):
             self.read_manifest()
         ei_cmd = self.get_finalized_command('egg_info')
+        self._add_egg_info(cmd=ei_cmd)
         self.filelist.include_pattern("*", prefix=ei_cmd.egg_info)
 
+    def _add_egg_info(self, cmd):
+        """
+        Add paths for egg-info files for an external egg-base.
+
+        The egg-info files are written to egg-base. If egg-base is
+        outside the current working directory, this method
+        searchs the egg-base directory for files to include
+        in the manifest. Uses distutils.filelist.findall (which is
+        really the version monkeypatched in by setuptools/__init__.py)
+        to perform the search.
+
+        Since findall records relative paths, prefix the returned
+        paths with cmd.egg_base, so add_default's include_pattern call
+        (which is looking for the absolute cmd.egg_info) will match
+        them.
+        """
+        if cmd.egg_base == os.curdir:
+            # egg-info files were already added by something else
+            return
+
+        discovered = distutils.filelist.findall(cmd.egg_base)
+        resolved = (os.path.join(cmd.egg_base, path) for path in discovered)
+        self.filelist.allfiles.extend(resolved)
+
     def prune_file_list(self):
         build = self.get_finalized_command('build')
         base_dir = self.distribution.get_fullname()
@@ -382,6 +421,12 @@ def write_requirements(cmd, basename, filename):
     cmd.write_or_delete_file("requirements", filename, data.getvalue())
 
 
+def write_setup_requirements(cmd, basename, filename):
+    data = 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(
         [
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/install_scripts.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/install_scripts.py
index eb79fa3..be66cb2 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/install_scripts.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/install_scripts.py
@@ -13,8 +13,7 @@ class install_scripts(orig.install_scripts):
         self.no_ep = False
 
     def run(self):
-        from setuptools.command.easy_install import get_script_args
-        from setuptools.command.easy_install import sys_executable
+        import setuptools.command.easy_install as ei
 
         self.run_command("egg_info")
         if self.distribution.scripts:
@@ -31,11 +30,17 @@ class install_scripts(orig.install_scripts):
             ei_cmd.egg_name, ei_cmd.egg_version,
         )
         bs_cmd = self.get_finalized_command('build_scripts')
-        executable = getattr(bs_cmd, 'executable', sys_executable)
-        is_wininst = getattr(
-            self.get_finalized_command("bdist_wininst"), '_is_running', False
-        )
-        for args in get_script_args(dist, executable, is_wininst):
+        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
+        # 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):
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/sdist.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/sdist.py
index a77c39f..851a177 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/sdist.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/sdist.py
@@ -1,19 +1,17 @@
 from glob import glob
-from distutils.util import convert_path
 from distutils import log
 import distutils.command.sdist as orig
 import os
-import re
 import sys
 
-from setuptools import svn_utils
 from setuptools.compat import PY3
 from setuptools.utils import cs_path_exists
 
 import pkg_resources
 
-READMES = ('README', 'README.rst', 'README.txt')
+READMES = 'README', 'README.rst', 'README.txt'
 
+_default_revctrl = list
 
 def walk_revctrl(dirname=''):
     """Find all files under revision control"""
@@ -22,60 +20,6 @@ def walk_revctrl(dirname=''):
             yield item
 
 
-# TODO will need test case
-class re_finder(object):
-    """
-    Finder that locates files based on entries in a file matched by a
-    regular expression.
-    """
-
-    def __init__(self, path, pattern, postproc=lambda x: x):
-        self.pattern = pattern
-        self.postproc = postproc
-        self.entries_path = convert_path(path)
-
-    def _finder(self, dirname, filename):
-        f = open(filename, 'rU')
-        try:
-            data = f.read()
-        finally:
-            f.close()
-        for match in self.pattern.finditer(data):
-            path = match.group(1)
-            # postproc was formerly used when the svn finder
-            # was an re_finder for calling unescape
-            path = self.postproc(path)
-            yield svn_utils.joinpath(dirname, path)
-
-    def find(self, dirname=''):
-        path = svn_utils.joinpath(dirname, self.entries_path)
-
-        if not os.path.isfile(path):
-            # entries file doesn't exist
-            return
-        for path in self._finder(dirname, path):
-            if os.path.isfile(path):
-                yield path
-            elif os.path.isdir(path):
-                for item in self.find(path):
-                    yield item
-
-    __call__ = find
-
-
-def _default_revctrl(dirname=''):
-    'Primary svn_cvs entry point'
-    for finder in finders:
-        for item in finder(dirname):
-            yield item
-
-
-finders = [
-    re_finder('CVS/Entries', re.compile(r"^\w?/([^/]+)/", re.M)),
-    svn_utils.svn_finder,
-]
-
-
 class sdist(orig.sdist):
     """Smart sdist that finds anything supported by revision control"""
 
@@ -126,7 +70,8 @@ class sdist(orig.sdist):
         try:
             orig.sdist.read_template(self)
         except:
-            sys.exc_info()[2].tb_next.tb_frame.f_locals['template'].close()
+            _, _, 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
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/test.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/test.py
index 1038da7..160e21c 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/test.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/test.py
@@ -1,6 +1,5 @@
 from distutils.errors import DistutilsOptionError
 from unittest import TestLoader
-import unittest
 import sys
 
 from pkg_resources import (resource_listdir, resource_exists, normalize_path,
@@ -12,7 +11,7 @@ from setuptools.py31compat import unittest_main
 
 
 class ScanningLoader(TestLoader):
-    def loadTestsFromModule(self, module):
+    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.
@@ -62,20 +61,16 @@ class test(Command):
 
     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"
-        elif self.test_module:
-            raise DistutilsOptionError(
-                "You may specify a module or a suite, but not both"
-            )
 
-        self.test_args = [self.test_suite]
-
-        if self.verbose:
-            self.test_args.insert(0, '--verbose')
         if self.test_loader is None:
             self.test_loader = getattr(self.distribution, 'test_loader', None)
         if self.test_loader is None:
@@ -83,6 +78,16 @@ class test(Command):
         if self.test_runner is None:
             self.test_runner = getattr(self.distribution, 'test_runner', None)
 
+    @property
+    def test_args(self):
+        return list(self._test_args())
+
+    def _test_args(self):
+        if self.verbose:
+            yield '--verbose'
+        if self.test_suite:
+            yield self.test_suite
+
     def with_project_on_sys_path(self, func):
         with_2to3 = PY3 and getattr(self.distribution, 'use_2to3', False)
 
@@ -133,20 +138,19 @@ class test(Command):
         if self.distribution.tests_require:
             self.distribution.fetch_build_eggs(self.distribution.tests_require)
 
-        if self.test_suite:
-            cmd = ' '.join(self.test_args)
-            if self.dry_run:
-                self.announce('skipping "unittest %s" (dry run)' % cmd)
-            else:
-                self.announce('running "unittest %s"' % cmd)
-                self.with_project_on_sys_path(self.run_tests)
+        cmd = ' '.join(self._argv)
+        if self.dry_run:
+            self.announce('skipping "%s" (dry run)' % cmd)
+        else:
+            self.announce('running "%s"' % cmd)
+            self.with_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 PY3 and getattr(self.distribution, 'use_2to3', False):
-            module = self.test_args[-1].split('.')[0]
+            module = self.test_suite.split('.')[0]
             if module in _namespace_packages:
                 del_modules = []
                 if module in sys.modules:
@@ -158,11 +162,15 @@ class test(Command):
                 list(map(sys.modules.__delitem__, del_modules))
 
         unittest_main(
-            None, None, [unittest.__file__] + self.test_args,
+            None, None, self._argv,
             testLoader=self._resolve_as_ep(self.test_loader),
             testRunner=self._resolve_as_ep(self.test_runner),
         )
 
+    @property
+    def _argv(self):
+        return ['unittest'] + self.test_args
+
     @staticmethod
     def _resolve_as_ep(val):
         """
@@ -172,4 +180,4 @@ class test(Command):
         if val is None:
             return
         parsed = EntryPoint.parse("x=" + val)
-        return parsed.load(require=False)()
+        return parsed.resolve()()
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/command/upload_docs.py b/Linux_i686/lib/python3.4/site-packages/setuptools/command/upload_docs.py
index cd6c300..001ee93 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/command/upload_docs.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/command/upload_docs.py
@@ -169,8 +169,7 @@ class upload_docs(upload):
             conn.putheader('Authorization', auth)
             conn.endheaders()
             conn.send(body)
-        except socket.error:
-            e = sys.exc_info()[1]
+        except socket.error as e:
             self.announce(str(e), log.ERROR)
             return
 
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/dist.py b/Linux_i686/lib/python3.4/site-packages/setuptools/dist.py
index 8b36f67..d7ad465 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/dist.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/dist.py
@@ -15,8 +15,12 @@ from distutils.errors import (DistutilsOptionError, DistutilsPlatformError,
 
 from setuptools.depends import Require
 from setuptools.compat import basestring, PY2
+from setuptools import windows_support
 import pkg_resources
 
+packaging = pkg_resources.packaging
+
+
 def _get_unpatched(cls):
     """Protect against re-patching the distutils if reloaded
 
@@ -111,24 +115,26 @@ def check_extras(dist, attr, value):
 def assert_bool(dist, attr, value):
     """Verify that value is True, False, 0, or 1"""
     if bool(value) != value:
-        raise DistutilsSetupError(
-            "%r must be a boolean value (got %r)" % (attr,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))
-    except (TypeError,ValueError):
-        raise DistutilsSetupError(
-            "%r must be a string or list of strings "
-            "containing valid project/version requirement specifiers" % (attr,)
+    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_entry_points(dist, attr, value):
     """Verify that entry_points map is parseable"""
     try:
         pkg_resources.EntryPoint.parse_map(value)
-    except ValueError:
-        e = sys.exc_info()[1]
+    except ValueError as e:
         raise DistutilsSetupError(e)
 
 def check_test_suite(dist, attr, value):
@@ -268,6 +274,26 @@ class Distribution(_Distribution):
             # 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
+                )
+
     def parse_command_line(self):
         """Process features after parsing command line options"""
         result = _Distribution.parse_command_line(self)
@@ -305,6 +331,21 @@ class Distribution(_Distribution):
         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"""
 
@@ -328,8 +369,9 @@ class Distribution(_Distribution):
                 if 'find_links' in opts:
                     links = opts['find_links'][1].split() + links
                 opts['find_links'] = ('setup', links)
+            install_dir = self.get_egg_cache_dir()
             cmd = easy_install(
-                dist, args=["x"], install_dir=os.curdir, exclude_scripts=True,
+                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
             )
@@ -393,7 +435,8 @@ class Distribution(_Distribution):
     def print_commands(self):
         for ep in pkg_resources.iter_entry_points('distutils.commands'):
             if ep.name not in self.cmdclass:
-                cmdclass = ep.load(False) # don't require extras, we're not running
+                # don't require extras as the commands won't be invoked
+                cmdclass = ep.resolve()
                 self.cmdclass[ep.name] = cmdclass
         return _Distribution.print_commands(self)
 
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/extension.py b/Linux_i686/lib/python3.4/site-packages/setuptools/extension.py
index 8178ed3..35eb7c7 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/extension.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/extension.py
@@ -12,35 +12,33 @@ _Extension = _get_unpatched(distutils.core.Extension)
 
 msvc9_support.patch_for_specialized_compiler()
 
-def have_pyrex():
+def _have_cython():
     """
-    Return True if Cython or Pyrex can be imported.
+    Return True if Cython can be imported.
     """
-    pyrex_impls = 'Cython.Distutils.build_ext', 'Pyrex.Distutils.build_ext'
-    for pyrex_impl in pyrex_impls:
-        try:
-            # from (pyrex_impl) import build_ext
-            __import__(pyrex_impl, fromlist=['build_ext']).build_ext
-            return True
-        except Exception:
-            pass
+    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
+
 
 class Extension(_Extension):
     """Extension that uses '.c' files in place of '.pyx' files"""
 
-    def __init__(self, *args, **kw):
-        _Extension.__init__(self, *args, **kw)
-        self._convert_pyx_sources_to_lang()
-
     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_pyrex():
+        if _have_cython():
             # the build has Cython, so allow it to compile the .pyx files
             return
         lang = self.language or ''
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/gui-32.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/gui-32.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/gui-64.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/gui-64.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/gui-arm-32.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/gui-arm-32.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/gui.exe b/Linux_i686/lib/python3.4/site-packages/setuptools/gui.exe
old mode 100755
new mode 100644
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/msvc9_support.py b/Linux_i686/lib/python3.4/site-packages/setuptools/msvc9_support.py
index d0be70e..a69c747 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/msvc9_support.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/msvc9_support.py
@@ -1,5 +1,3 @@
-import sys
-
 try:
     import distutils.msvc9compiler
 except ImportError:
@@ -29,13 +27,15 @@ def patch_for_specialized_compiler():
 def find_vcvarsall(version):
     Reg = distutils.msvc9compiler.Reg
     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(VC_BASE % ('', version), "installdir")
+        productdir = Reg.get_value(key, "installdir")
     except KeyError:
         try:
             # All-user installs on a 64-bit system register here
-            productdir = Reg.get_value(VC_BASE % ('Wow6432Node\\', version), "installdir")
+            key = VC_BASE % ('Wow6432Node\\', version)
+            productdir = Reg.get_value(key, "installdir")
         except KeyError:
             productdir = None
 
@@ -50,8 +50,7 @@ def find_vcvarsall(version):
 def query_vcvarsall(version, *args, **kwargs):
     try:
         return unpatched['query_vcvarsall'](version, *args, **kwargs)
-    except distutils.errors.DistutilsPlatformError:
-        exc = sys.exc_info()[1]
+    except distutils.errors.DistutilsPlatformError as exc:
         if exc and "vcvarsall.bat" in exc.args[0]:
             message = 'Microsoft Visual C++ %0.1f is required (%s).' % (version, exc.args[0])
             if int(version) == 9:
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/package_index.py b/Linux_i686/lib/python3.4/site-packages/setuptools/package_index.py
index 58572ce..cabf103 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/package_index.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/package_index.py
@@ -138,10 +138,9 @@ def interpret_distro_name(
     # versions in distribution archive names (sdist and bdist).
 
     parts = basename.split('-')
-    if not py_version:
-        for i,p in enumerate(parts[2:]):
-            if len(p)==5 and p.startswith('py2.'):
-                return # It's a bdist_dumb, not an sdist -- bail out
+    if not py_version and any(re.match('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(
@@ -699,25 +698,21 @@ class PackageIndex(Environment):
             return local_open(url)
         try:
             return open_with_auth(url, self.opener)
-        except (ValueError, httplib.InvalidURL):
-            v = sys.exc_info()[1]
+        except (ValueError, httplib.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 urllib2.HTTPError:
-            v = sys.exc_info()[1]
+        except urllib2.HTTPError as v:
             return v
-        except urllib2.URLError:
-            v = sys.exc_info()[1]
+        except urllib2.URLError as v:
             if warning:
                 self.warn(warning, v.reason)
             else:
                 raise DistutilsError("Download error for %s: %s"
                                      % (url, v.reason))
-        except httplib.BadStatusLine:
-            v = sys.exc_info()[1]
+        except httplib.BadStatusLine as v:
             if warning:
                 self.warn(warning, v.line)
             else:
@@ -726,8 +721,7 @@ class PackageIndex(Environment):
                     'down, %s' %
                     (url, v.line)
                 )
-        except httplib.HTTPException:
-            v = sys.exc_info()[1]
+        except httplib.HTTPException as v:
             if warning:
                 self.warn(warning, v)
             else:
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/sandbox.py b/Linux_i686/lib/python3.4/site-packages/setuptools/sandbox.py
index e79a13a..213cebf 100644
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/sandbox.py
+++ b/Linux_i686/lib/python3.4/site-packages/setuptools/sandbox.py
@@ -5,10 +5,12 @@ import operator
 import functools
 import itertools
 import re
+import contextlib
+import pickle
 
 import pkg_resources
 
-if os.name == "java":
+if sys.platform.startswith('java'):
     import org.python.modules.posix.PosixModule as _os
 else:
     _os = sys.modules[os.name]
@@ -20,6 +22,7 @@ _open = open
 from distutils.errors import DistutilsError
 from pkg_resources import working_set
 
+from setuptools import compat
 from setuptools.compat import builtins
 
 __all__ = [
@@ -31,31 +34,197 @@ def _execfile(filename, globals, locals=None):
     Python 3 implementation of execfile.
     """
     mode = 'rb'
-    # Python 2.6 compile requires LF for newlines, so use deprecated
-    #  Universal newlines support.
-    if sys.version_info < (2, 7):
-        mode += 'U'
     with open(filename, mode) as stream:
         script = stream.read()
+    # compile() function in Python 2.6 and 3.1 requires LF line endings.
+    if sys.version_info[:2] < (2, 7) or sys.version_info[:2] >= (3, 0) and sys.version_info[:2] < (3, 2):
+        script = script.replace(b'\r\n', b'\n')
+        script = script.replace(b'\r', b'\n')
     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
+    """
+    if not os.path.isdir(replacement):
+        os.makedirs(replacement)
+
+    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.
+    """
+    @classmethod
+    def dump(cls, 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:
+            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)
+        compat.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
+    """
+    pattern = re.compile('(setuptools|pkg_resources|distutils)(\.|$)')
+    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"""
-    old_dir = os.getcwd()
-    save_argv = sys.argv[:]
-    save_path = sys.path[:]
     setup_dir = os.path.abspath(os.path.dirname(setup_script))
-    temp_dir = os.path.join(setup_dir,'temp')
-    if not os.path.isdir(temp_dir): os.makedirs(temp_dir)
-    save_tmp = tempfile.tempdir
-    save_modules = sys.modules.copy()
-    pr_state = pkg_resources.__getstate__()
-    try:
-        tempfile.tempdir = temp_dir
-        os.chdir(setup_dir)
+    with setup_context(setup_dir):
         try:
             sys.argv[:] = [setup_script]+list(args)
             sys.path.insert(0, setup_dir)
@@ -66,26 +235,10 @@ def run_setup(setup_script, args):
                 ns = dict(__file__=setup_script, __name__='__main__')
                 _execfile(setup_script, ns)
             DirectorySandbox(setup_dir).run(runner)
-        except SystemExit:
-            v = sys.exc_info()[1]
+        except SystemExit as v:
             if v.args and v.args[0]:
                 raise
             # Normal exit, just return
-    finally:
-        pkg_resources.__setstate__(pr_state)
-        sys.modules.update(save_modules)
-        # remove any modules imported within the sandbox
-        del_modules = [
-            mod_name for mod_name in sys.modules
-            if mod_name not in save_modules
-            # exclude any encodings modules. See #285
-            and not mod_name.startswith('encodings.')
-        ]
-        list(map(sys.modules.__delitem__, del_modules))
-        os.chdir(old_dir)
-        sys.path[:] = save_path
-        sys.argv[:] = save_argv
-        tempfile.tempdir = save_tmp
 
 
 class AbstractSandbox:
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/svn_utils.py b/Linux_i686/lib/python3.4/site-packages/setuptools/svn_utils.py
deleted file mode 100644
index dadb682..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/svn_utils.py
+++ /dev/null
@@ -1,585 +0,0 @@
-from __future__ import absolute_import
-
-import os
-import re
-import sys
-from distutils import log
-import xml.dom.pulldom
-import shlex
-import locale
-import codecs
-import unicodedata
-import warnings
-from setuptools.compat import unicode, PY2
-from setuptools.py31compat import TemporaryDirectory
-from xml.sax.saxutils import unescape
-
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-
-from subprocess import Popen as _Popen, PIPE as _PIPE
-
-#NOTE: Use of the command line options require SVN 1.3 or newer (December 2005)
-#      and SVN 1.3 hasn't been supported by the developers since mid 2008.
-
-#subprocess is called several times with shell=(sys.platform=='win32')
-#see the follow for more information:
-#       http://bugs.python.org/issue8557
-#       http://stackoverflow.com/questions/5658622/
-#              python-subprocess-popen-environment-path
-
-def _run_command(args, stdout=_PIPE, stderr=_PIPE, encoding=None, stream=0):
-    #regarding the shell argument, see: http://bugs.python.org/issue8557
-    try:
-        proc = _Popen(args, stdout=stdout, stderr=stderr,
-                      shell=(sys.platform == 'win32'))
-
-        data = proc.communicate()[stream]
-    except OSError:
-        return 1, ''
-
-    #doubled checked and
-    data = decode_as_string(data, encoding)
-
-    #communciate calls wait()
-    return proc.returncode, data
-
-
-def _get_entry_schedule(entry):
-    schedule = entry.getElementsByTagName('schedule')[0]
-    return "".join([t.nodeValue
-                    for t in schedule.childNodes
-                    if t.nodeType == t.TEXT_NODE])
-
-
-def _get_target_property(target):
-    property_text = target.getElementsByTagName('property')[0]
-    return "".join([t.nodeValue
-                    for t in property_text.childNodes
-                    if t.nodeType == t.TEXT_NODE])
-
-
-def _get_xml_data(decoded_str):
-    if PY2:
-        #old versions want an encoded string
-        data = decoded_str.encode('utf-8')
-    else:
-        data = decoded_str
-    return data
-
-
-def joinpath(prefix, *suffix):
-    if not prefix or prefix == '.':
-        return os.path.join(*suffix)
-    return os.path.join(prefix, *suffix)
-
-def determine_console_encoding():
-    try:
-        #try for the preferred encoding
-        encoding = locale.getpreferredencoding()
-
-        #see if the locale.getdefaultlocale returns null
-        #some versions of python\platforms return US-ASCII
-        #when it cannot determine an encoding
-        if not encoding or encoding == "US-ASCII":
-            encoding = locale.getdefaultlocale()[1]
-
-        if encoding:
-            codecs.lookup(encoding)  # make sure a lookup error is not made
-
-    except (locale.Error, LookupError):
-        encoding = None
-
-    is_osx = sys.platform == "darwin"
-    if not encoding:
-        return ["US-ASCII", "utf-8"][is_osx]
-    elif encoding.startswith("mac-") and is_osx:
-        #certain versions of python would return mac-roman as default
-        #OSX as a left over of earlier mac versions.
-        return "utf-8"
-    else:
-        return encoding
-
-_console_encoding = determine_console_encoding()
-
-def decode_as_string(text, encoding=None):
-    """
-    Decode the console or file output explicitly using getpreferredencoding.
-    The text paraemeter should be a encoded string, if not no decode occurs
-    If no encoding is given, getpreferredencoding is used.  If encoding is
-    specified, that is used instead.  This would be needed for SVN --xml
-    output.  Unicode is explicitly put in composed NFC form.
-
-    --xml should be UTF-8 (SVN Issue 2938) the discussion on the Subversion
-    DEV List from 2007 seems to indicate the same.
-    """
-    #text should be a byte string
-
-    if encoding is None:
-        encoding = _console_encoding
-
-    if not isinstance(text, unicode):
-        text = text.decode(encoding)
-
-    text = unicodedata.normalize('NFC', text)
-
-    return text
-
-
-def parse_dir_entries(decoded_str):
-    '''Parse the entries from a recursive info xml'''
-    doc = xml.dom.pulldom.parseString(_get_xml_data(decoded_str))
-    entries = list()
-
-    for event, node in doc:
-        if event == 'START_ELEMENT' and node.nodeName == 'entry':
-            doc.expandNode(node)
-            if not _get_entry_schedule(node).startswith('delete'):
-                entries.append((node.getAttribute('path'),
-                                node.getAttribute('kind')))
-
-    return entries[1:]  # do not want the root directory
-
-
-def parse_externals_xml(decoded_str, prefix=''):
-    '''Parse a propget svn:externals xml'''
-    prefix = os.path.normpath(prefix)
-    prefix = os.path.normcase(prefix)
-
-    doc = xml.dom.pulldom.parseString(_get_xml_data(decoded_str))
-    externals = list()
-
-    for event, node in doc:
-        if event == 'START_ELEMENT' and node.nodeName == 'target':
-            doc.expandNode(node)
-            path = os.path.normpath(node.getAttribute('path'))
-
-            if os.path.normcase(path).startswith(prefix):
-                path = path[len(prefix)+1:]
-
-            data = _get_target_property(node)
-            #data should be decoded already
-            for external in parse_external_prop(data):
-                externals.append(joinpath(path, external))
-
-    return externals  # do not want the root directory
-
-
-def parse_external_prop(lines):
-    """
-    Parse the value of a retrieved svn:externals entry.
-
-    possible token setups (with quotng and backscaping in laters versions)
-        URL[@#] EXT_FOLDERNAME
-        [-r#] URL EXT_FOLDERNAME
-        EXT_FOLDERNAME [-r#] URL
-    """
-    externals = []
-    for line in lines.splitlines():
-        line = line.lstrip()  # there might be a "\ "
-        if not line:
-            continue
-
-        if PY2:
-            #shlex handles NULLs just fine and shlex in 2.7 tries to encode
-            #as ascii automatiically
-            line = line.encode('utf-8')
-        line = shlex.split(line)
-        if PY2:
-            line = [x.decode('utf-8') for x in line]
-
-        #EXT_FOLDERNAME is either the first or last depending on where
-        #the URL falls
-        if urlparse.urlsplit(line[-1])[0]:
-            external = line[0]
-        else:
-            external = line[-1]
-
-        external = decode_as_string(external, encoding="utf-8")
-        externals.append(os.path.normpath(external))
-
-    return externals
-
-
-def parse_prop_file(filename, key):
-    found = False
-    f = open(filename, 'rt')
-    data = ''
-    try:
-        for line in iter(f.readline, ''):    # can't use direct iter!
-            parts = line.split()
-            if len(parts) == 2:
-                kind, length = parts
-                data = f.read(int(length))
-                if kind == 'K' and data == key:
-                    found = True
-                elif kind == 'V' and found:
-                    break
-    finally:
-        f.close()
-
-    return data
-
-
-class SvnInfo(object):
-    '''
-    Generic svn_info object.  No has little knowledge of how to extract
-    information.  Use cls.load to instatiate according svn version.
-
-    Paths are not filesystem encoded.
-    '''
-
-    @staticmethod
-    def get_svn_version():
-        # Temp config directory should be enough to check for repository
-        # This is needed because .svn always creates .subversion and
-        # some operating systems do not handle dot directory correctly.
-        # Real queries in real svn repos with be concerned with it creation
-        with TemporaryDirectory() as tempdir:
-            code, data = _run_command(['svn',
-                                       '--config-dir', tempdir,
-                                       '--version',
-                                       '--quiet'])
-
-        if code == 0 and data:
-            return data.strip()
-        else:
-            return ''
-
-    #svnversion return values (previous implementations return max revision)
-    #   4123:4168     mixed revision working copy
-    #   4168M         modified working copy
-    #   4123S         switched working copy
-    #   4123:4168MS   mixed revision, modified, switched working copy
-    revision_re = re.compile(r'(?:([\-0-9]+):)?(\d+)([a-z]*)\s*$', re.I)
-
-    @classmethod
-    def load(cls, dirname=''):
-        normdir = os.path.normpath(dirname)
-
-        # Temp config directory should be enough to check for repository
-        # This is needed because .svn always creates .subversion and
-        # some operating systems do not handle dot directory correctly.
-        # Real queries in real svn repos with be concerned with it creation
-        with TemporaryDirectory() as tempdir:
-            code, data = _run_command(['svn',
-                                       '--config-dir', tempdir,
-                                       'info', normdir])
-
-        # Must check for some contents, as some use empty directories
-        # in testcases, however only enteries is needed also the info
-        # command above MUST have worked
-        svn_dir = os.path.join(normdir, '.svn')
-        is_svn_wd = (not code or
-                     os.path.isfile(os.path.join(svn_dir, 'entries')))
-
-        svn_version = tuple(cls.get_svn_version().split('.'))
-
-        try:
-            base_svn_version = tuple(int(x) for x in svn_version[:2])
-        except ValueError:
-            base_svn_version = tuple()
-
-        if not is_svn_wd:
-            #return an instance of this NO-OP class
-            return SvnInfo(dirname)
-
-        if code or not base_svn_version or base_svn_version < (1, 3):
-            warnings.warn(("No SVN 1.3+ command found: falling back "
-                           "on pre 1.7 .svn parsing"), DeprecationWarning)
-            return SvnFileInfo(dirname)
-
-        if base_svn_version < (1, 5):
-            return Svn13Info(dirname)
-
-        return Svn15Info(dirname)
-
-    def __init__(self, path=''):
-        self.path = path
-        self._entries = None
-        self._externals = None
-
-    def get_revision(self):
-        'Retrieve the directory revision informatino using svnversion'
-        code, data = _run_command(['svnversion', '-c', self.path])
-        if code:
-            log.warn("svnversion failed")
-            return 0
-
-        parsed = self.revision_re.match(data)
-        if parsed:
-            return int(parsed.group(2))
-        else:
-            return 0
-
-    @property
-    def entries(self):
-        if self._entries is None:
-            self._entries = self.get_entries()
-        return self._entries
-
-    @property
-    def externals(self):
-        if self._externals is None:
-            self._externals = self.get_externals()
-        return self._externals
-
-    def iter_externals(self):
-        '''
-        Iterate over the svn:external references in the repository path.
-        '''
-        for item in self.externals:
-            yield item
-
-    def iter_files(self):
-        '''
-        Iterate over the non-deleted file entries in the repository path
-        '''
-        for item, kind in self.entries:
-            if kind.lower() == 'file':
-                yield item
-
-    def iter_dirs(self, include_root=True):
-        '''
-        Iterate over the non-deleted file entries in the repository path
-        '''
-        if include_root:
-            yield self.path
-        for item, kind in self.entries:
-            if kind.lower() == 'dir':
-                yield item
-
-    def get_entries(self):
-        return []
-
-    def get_externals(self):
-        return []
-
-
-class Svn13Info(SvnInfo):
-    def get_entries(self):
-        code, data = _run_command(['svn', 'info', '-R', '--xml', self.path],
-                                  encoding="utf-8")
-
-        if code:
-            log.debug("svn info failed")
-            return []
-
-        return parse_dir_entries(data)
-
-    def get_externals(self):
-        #Previous to 1.5 --xml was not supported for svn propget and the -R
-        #output format breaks the shlex compatible semantics.
-        cmd = ['svn', 'propget', 'svn:externals']
-        result = []
-        for folder in self.iter_dirs():
-            code, lines = _run_command(cmd + [folder], encoding="utf-8")
-            if code != 0:
-                log.warn("svn propget failed")
-                return []
-            #lines should a str
-            for external in parse_external_prop(lines):
-                if folder:
-                    external = os.path.join(folder, external)
-                result.append(os.path.normpath(external))
-
-        return result
-
-
-class Svn15Info(Svn13Info):
-    def get_externals(self):
-        cmd = ['svn', 'propget', 'svn:externals', self.path, '-R', '--xml']
-        code, lines = _run_command(cmd, encoding="utf-8")
-        if code:
-            log.debug("svn propget failed")
-            return []
-        return parse_externals_xml(lines, prefix=os.path.abspath(self.path))
-
-
-class SvnFileInfo(SvnInfo):
-
-    def __init__(self, path=''):
-        super(SvnFileInfo, self).__init__(path)
-        self._directories = None
-        self._revision = None
-
-    def _walk_svn(self, base):
-        entry_file = joinpath(base, '.svn', 'entries')
-        if os.path.isfile(entry_file):
-            entries = SVNEntriesFile.load(base)
-            yield (base, False, entries.parse_revision())
-            for path in entries.get_undeleted_records():
-                path = decode_as_string(path)
-                path = joinpath(base, path)
-                if os.path.isfile(path):
-                    yield (path, True, None)
-                elif os.path.isdir(path):
-                    for item in self._walk_svn(path):
-                        yield item
-
-    def _build_entries(self):
-        entries = list()
-
-        rev = 0
-        for path, isfile, dir_rev in self._walk_svn(self.path):
-            if isfile:
-                entries.append((path, 'file'))
-            else:
-                entries.append((path, 'dir'))
-                rev = max(rev, dir_rev)
-
-        self._entries = entries
-        self._revision = rev
-
-    def get_entries(self):
-        if self._entries is None:
-            self._build_entries()
-        return self._entries
-
-    def get_revision(self):
-        if self._revision is None:
-            self._build_entries()
-        return self._revision
-
-    def get_externals(self):
-        prop_files = [['.svn', 'dir-prop-base'],
-                      ['.svn', 'dir-props']]
-        externals = []
-
-        for dirname in self.iter_dirs():
-            prop_file = None
-            for rel_parts in prop_files:
-                filename = joinpath(dirname, *rel_parts)
-                if os.path.isfile(filename):
-                    prop_file = filename
-
-            if prop_file is not None:
-                ext_prop = parse_prop_file(prop_file, 'svn:externals')
-                #ext_prop should be utf-8 coming from svn:externals
-                ext_prop = decode_as_string(ext_prop, encoding="utf-8")
-                externals.extend(parse_external_prop(ext_prop))
-
-        return externals
-
-
-def svn_finder(dirname=''):
-    #combined externals due to common interface
-    #combined externals and entries due to lack of dir_props in 1.7
-    info = SvnInfo.load(dirname)
-    for path in info.iter_files():
-        yield path
-
-    for path in info.iter_externals():
-        sub_info = SvnInfo.load(path)
-        for sub_path in sub_info.iter_files():
-            yield sub_path
-
-
-class SVNEntriesFile(object):
-    def __init__(self, data):
-        self.data = data
-
-    @classmethod
-    def load(class_, base):
-        filename = os.path.join(base, '.svn', 'entries')
-        f = open(filename)
-        try:
-            result = SVNEntriesFile.read(f)
-        finally:
-            f.close()
-        return result
-
-    @classmethod
-    def read(class_, fileobj):
-        data = fileobj.read()
-        is_xml = data.startswith(' revision_line_number
-                and section[revision_line_number])
-        ]
-        return rev_numbers
-
-    def get_undeleted_records(self):
-        undeleted = lambda s: s and s[0] and (len(s) < 6 or s[5] != 'delete')
-        result = [
-            section[0]
-            for section in self.get_sections()
-            if undeleted(section)
-        ]
-        return result
-
-
-class SVNEntriesFileXML(SVNEntriesFile):
-    def is_valid(self):
-        return True
-
-    def get_url(self):
-        "Get repository URL"
-        urlre = re.compile('url="([^"]+)"')
-        return urlre.search(self.data).group(1)
-
-    def parse_revision_numbers(self):
-        revre = re.compile(r'committed-rev="(\d+)"')
-        return [
-            int(m.group(1))
-            for m in revre.finditer(self.data)
-        ]
-
-    def get_undeleted_records(self):
-        entries_pattern = \
-            re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I)
-        results = [
-            unescape(match.group(1))
-            for match in entries_pattern.finditer(self.data)
-        ]
-        return results
-
-
-if __name__ == '__main__':
-    for name in svn_finder(sys.argv[1]):
-        print(name)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/__init__.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/__init__.py
deleted file mode 100644
index d6a4542..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/__init__.py
+++ /dev/null
@@ -1,351 +0,0 @@
-"""Tests for the 'setuptools' package"""
-import sys
-import os
-import unittest
-import doctest
-import distutils.core
-import distutils.cmd
-from distutils.errors import DistutilsOptionError, DistutilsPlatformError
-from distutils.errors import DistutilsSetupError
-from distutils.core import Extension
-from distutils.version import LooseVersion
-from setuptools.compat import func_code
-
-from setuptools.compat import func_code
-import setuptools.dist
-import setuptools.depends as dep
-from setuptools import Feature
-from setuptools.depends import Require
-
-def additional_tests():
-    suite = unittest.TestSuite((
-        doctest.DocFileSuite(
-            os.path.join('tests', 'api_tests.txt'),
-            optionflags=doctest.ELLIPSIS, package='pkg_resources',
-            ),
-        ))
-    if sys.platform == 'win32':
-        suite.addTest(doctest.DocFileSuite('win_script_wrapper.txt'))
-    return suite
-
-def makeSetup(**args):
-    """Return distribution from 'setup(**args)', without executing commands"""
-
-    distutils.core._setup_stop_after = "commandline"
-
-    # Don't let system command line leak into tests!
-    args.setdefault('script_args',['install'])
-
-    try:
-        return setuptools.setup(**args)
-    finally:
-        distutils.core._setup_stop_after = None
-
-
-class DependsTests(unittest.TestCase):
-
-    def testExtractConst(self):
-        if not hasattr(dep, 'extract_constant'):
-            # skip on non-bytecode platforms
-            return
-
-        def f1():
-            global x, y, z
-            x = "test"
-            y = z
-
-        fc = func_code(f1)
-        # unrecognized name
-        self.assertEqual(dep.extract_constant(fc,'q', -1), None)
-
-        # constant assigned
-        self.assertEqual(dep.extract_constant(fc,'x', -1), "test")
-
-        # expression assigned
-        self.assertEqual(dep.extract_constant(fc,'y', -1), -1)
-
-        # recognized name, not assigned
-        self.assertEqual(dep.extract_constant(fc,'z', -1), None)
-
-    def testFindModule(self):
-        self.assertRaises(ImportError, dep.find_module, 'no-such.-thing')
-        self.assertRaises(ImportError, dep.find_module, 'setuptools.non-existent')
-        f,p,i = dep.find_module('setuptools.tests')
-        f.close()
-
-    def testModuleExtract(self):
-        if not hasattr(dep, 'get_module_constant'):
-            # skip on non-bytecode platforms
-            return
-
-        from email import __version__
-        self.assertEqual(
-            dep.get_module_constant('email','__version__'), __version__
-        )
-        self.assertEqual(
-            dep.get_module_constant('sys','version'), sys.version
-        )
-        self.assertEqual(
-            dep.get_module_constant('setuptools.tests','__doc__'),__doc__
-        )
-
-    def testRequire(self):
-        if not hasattr(dep, 'extract_constant'):
-            # skip on non-bytecode platformsh
-            return
-
-        req = Require('Email','1.0.3','email')
-
-        self.assertEqual(req.name, 'Email')
-        self.assertEqual(req.module, 'email')
-        self.assertEqual(req.requested_version, '1.0.3')
-        self.assertEqual(req.attribute, '__version__')
-        self.assertEqual(req.full_name(), 'Email-1.0.3')
-
-        from email import __version__
-        self.assertEqual(req.get_version(), __version__)
-        self.assertTrue(req.version_ok('1.0.9'))
-        self.assertTrue(not req.version_ok('0.9.1'))
-        self.assertTrue(not req.version_ok('unknown'))
-
-        self.assertTrue(req.is_present())
-        self.assertTrue(req.is_current())
-
-        req = Require('Email 3000','03000','email',format=LooseVersion)
-        self.assertTrue(req.is_present())
-        self.assertTrue(not req.is_current())
-        self.assertTrue(not req.version_ok('unknown'))
-
-        req = Require('Do-what-I-mean','1.0','d-w-i-m')
-        self.assertTrue(not req.is_present())
-        self.assertTrue(not req.is_current())
-
-        req = Require('Tests', None, 'tests', homepage="http://example.com")
-        self.assertEqual(req.format, None)
-        self.assertEqual(req.attribute, None)
-        self.assertEqual(req.requested_version, None)
-        self.assertEqual(req.full_name(), 'Tests')
-        self.assertEqual(req.homepage, 'http://example.com')
-
-        paths = [os.path.dirname(p) for p in __path__]
-        self.assertTrue(req.is_present(paths))
-        self.assertTrue(req.is_current(paths))
-
-
-class DistroTests(unittest.TestCase):
-
-    def setUp(self):
-        self.e1 = Extension('bar.ext',['bar.c'])
-        self.e2 = Extension('c.y', ['y.c'])
-
-        self.dist = makeSetup(
-            packages=['a', 'a.b', 'a.b.c', 'b', 'c'],
-            py_modules=['b.d','x'],
-            ext_modules = (self.e1, self.e2),
-            package_dir = {},
-        )
-
-    def testDistroType(self):
-        self.assertTrue(isinstance(self.dist,setuptools.dist.Distribution))
-
-    def testExcludePackage(self):
-        self.dist.exclude_package('a')
-        self.assertEqual(self.dist.packages, ['b','c'])
-
-        self.dist.exclude_package('b')
-        self.assertEqual(self.dist.packages, ['c'])
-        self.assertEqual(self.dist.py_modules, ['x'])
-        self.assertEqual(self.dist.ext_modules, [self.e1, self.e2])
-
-        self.dist.exclude_package('c')
-        self.assertEqual(self.dist.packages, [])
-        self.assertEqual(self.dist.py_modules, ['x'])
-        self.assertEqual(self.dist.ext_modules, [self.e1])
-
-        # test removals from unspecified options
-        makeSetup().exclude_package('x')
-
-    def testIncludeExclude(self):
-        # remove an extension
-        self.dist.exclude(ext_modules=[self.e1])
-        self.assertEqual(self.dist.ext_modules, [self.e2])
-
-        # add it back in
-        self.dist.include(ext_modules=[self.e1])
-        self.assertEqual(self.dist.ext_modules, [self.e2, self.e1])
-
-        # should not add duplicate
-        self.dist.include(ext_modules=[self.e1])
-        self.assertEqual(self.dist.ext_modules, [self.e2, self.e1])
-
-    def testExcludePackages(self):
-        self.dist.exclude(packages=['c','b','a'])
-        self.assertEqual(self.dist.packages, [])
-        self.assertEqual(self.dist.py_modules, ['x'])
-        self.assertEqual(self.dist.ext_modules, [self.e1])
-
-    def testEmpty(self):
-        dist = makeSetup()
-        dist.include(packages=['a'], py_modules=['b'], ext_modules=[self.e2])
-        dist = makeSetup()
-        dist.exclude(packages=['a'], py_modules=['b'], ext_modules=[self.e2])
-
-    def testContents(self):
-        self.assertTrue(self.dist.has_contents_for('a'))
-        self.dist.exclude_package('a')
-        self.assertTrue(not self.dist.has_contents_for('a'))
-
-        self.assertTrue(self.dist.has_contents_for('b'))
-        self.dist.exclude_package('b')
-        self.assertTrue(not self.dist.has_contents_for('b'))
-
-        self.assertTrue(self.dist.has_contents_for('c'))
-        self.dist.exclude_package('c')
-        self.assertTrue(not self.dist.has_contents_for('c'))
-
-    def testInvalidIncludeExclude(self):
-        self.assertRaises(DistutilsSetupError,
-            self.dist.include, nonexistent_option='x'
-        )
-        self.assertRaises(DistutilsSetupError,
-            self.dist.exclude, nonexistent_option='x'
-        )
-        self.assertRaises(DistutilsSetupError,
-            self.dist.include, packages={'x':'y'}
-        )
-        self.assertRaises(DistutilsSetupError,
-            self.dist.exclude, packages={'x':'y'}
-        )
-        self.assertRaises(DistutilsSetupError,
-            self.dist.include, ext_modules={'x':'y'}
-        )
-        self.assertRaises(DistutilsSetupError,
-            self.dist.exclude, ext_modules={'x':'y'}
-        )
-
-        self.assertRaises(DistutilsSetupError,
-            self.dist.include, package_dir=['q']
-        )
-        self.assertRaises(DistutilsSetupError,
-            self.dist.exclude, package_dir=['q']
-        )
-
-
-class FeatureTests(unittest.TestCase):
-
-    def setUp(self):
-        self.req = Require('Distutils','1.0.3','distutils')
-        self.dist = makeSetup(
-            features={
-                'foo': Feature("foo",standard=True,require_features=['baz',self.req]),
-                'bar': Feature("bar",  standard=True, packages=['pkg.bar'],
-                               py_modules=['bar_et'], remove=['bar.ext'],
-                       ),
-                'baz': Feature(
-                        "baz", optional=False, packages=['pkg.baz'],
-                        scripts = ['scripts/baz_it'],
-                        libraries=[('libfoo','foo/foofoo.c')]
-                       ),
-                'dwim': Feature("DWIM", available=False, remove='bazish'),
-            },
-            script_args=['--without-bar', 'install'],
-            packages = ['pkg.bar', 'pkg.foo'],
-            py_modules = ['bar_et', 'bazish'],
-            ext_modules = [Extension('bar.ext',['bar.c'])]
-        )
-
-    def testDefaults(self):
-        self.assertTrue(not
-            Feature(
-                "test",standard=True,remove='x',available=False
-            ).include_by_default()
-        )
-        self.assertTrue(
-            Feature("test",standard=True,remove='x').include_by_default()
-        )
-        # Feature must have either kwargs, removes, or require_features
-        self.assertRaises(DistutilsSetupError, Feature, "test")
-
-    def testAvailability(self):
-        self.assertRaises(
-            DistutilsPlatformError,
-            self.dist.features['dwim'].include_in, self.dist
-        )
-
-    def testFeatureOptions(self):
-        dist = self.dist
-        self.assertTrue(
-            ('with-dwim',None,'include DWIM') in dist.feature_options
-        )
-        self.assertTrue(
-            ('without-dwim',None,'exclude DWIM (default)') in dist.feature_options
-        )
-        self.assertTrue(
-            ('with-bar',None,'include bar (default)') in dist.feature_options
-        )
-        self.assertTrue(
-            ('without-bar',None,'exclude bar') in dist.feature_options
-        )
-        self.assertEqual(dist.feature_negopt['without-foo'],'with-foo')
-        self.assertEqual(dist.feature_negopt['without-bar'],'with-bar')
-        self.assertEqual(dist.feature_negopt['without-dwim'],'with-dwim')
-        self.assertTrue(not 'without-baz' in dist.feature_negopt)
-
-    def testUseFeatures(self):
-        dist = self.dist
-        self.assertEqual(dist.with_foo,1)
-        self.assertEqual(dist.with_bar,0)
-        self.assertEqual(dist.with_baz,1)
-        self.assertTrue(not 'bar_et' in dist.py_modules)
-        self.assertTrue(not 'pkg.bar' in dist.packages)
-        self.assertTrue('pkg.baz' in dist.packages)
-        self.assertTrue('scripts/baz_it' in dist.scripts)
-        self.assertTrue(('libfoo','foo/foofoo.c') in dist.libraries)
-        self.assertEqual(dist.ext_modules,[])
-        self.assertEqual(dist.require_features, [self.req])
-
-        # If we ask for bar, it should fail because we explicitly disabled
-        # it on the command line
-        self.assertRaises(DistutilsOptionError, dist.include_feature, 'bar')
-
-    def testFeatureWithInvalidRemove(self):
-        self.assertRaises(
-            SystemExit, makeSetup, features = {'x':Feature('x', remove='y')}
-        )
-
-class TestCommandTests(unittest.TestCase):
-
-    def testTestIsCommand(self):
-        test_cmd = makeSetup().get_command_obj('test')
-        self.assertTrue(isinstance(test_cmd, distutils.cmd.Command))
-
-    def testLongOptSuiteWNoDefault(self):
-        ts1 = makeSetup(script_args=['test','--test-suite=foo.tests.suite'])
-        ts1 = ts1.get_command_obj('test')
-        ts1.ensure_finalized()
-        self.assertEqual(ts1.test_suite, 'foo.tests.suite')
-
-    def testDefaultSuite(self):
-        ts2 = makeSetup(test_suite='bar.tests.suite').get_command_obj('test')
-        ts2.ensure_finalized()
-        self.assertEqual(ts2.test_suite, 'bar.tests.suite')
-
-    def testDefaultWModuleOnCmdLine(self):
-        ts3 = makeSetup(
-            test_suite='bar.tests',
-            script_args=['test','-m','foo.tests']
-        ).get_command_obj('test')
-        ts3.ensure_finalized()
-        self.assertEqual(ts3.test_module, 'foo.tests')
-        self.assertEqual(ts3.test_suite,  'foo.tests.test_suite')
-
-    def testConflictingOptions(self):
-        ts4 = makeSetup(
-            script_args=['test','-m','bar.tests', '-s','foo.tests.suite']
-        ).get_command_obj('test')
-        self.assertRaises(DistutilsOptionError, ts4.ensure_finalized)
-
-    def testNoSuite(self):
-        ts5 = makeSetup().get_command_obj('test')
-        ts5.ensure_finalized()
-        self.assertEqual(ts5.test_suite, None)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/environment.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/environment.py
deleted file mode 100644
index 476d280..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/environment.py
+++ /dev/null
@@ -1,165 +0,0 @@
-import os
-import zipfile
-import sys
-import tempfile
-import unittest
-import shutil
-import stat
-import unicodedata
-
-from subprocess import Popen as _Popen, PIPE as _PIPE
-
-
-def _extract(self, member, path=None, pwd=None):
-    """for zipfile py2.5 borrowed from cpython"""
-    if not isinstance(member, zipfile.ZipInfo):
-        member = self.getinfo(member)
-
-    if path is None:
-        path = os.getcwd()
-
-    return _extract_member(self, member, path, pwd)
-
-
-def _extract_from_zip(self, name, dest_path):
-    dest_file = open(dest_path, 'wb')
-    try:
-        dest_file.write(self.read(name))
-    finally:
-        dest_file.close()
-
-
-def _extract_member(self, member, targetpath, pwd):
-    """for zipfile py2.5 borrowed from cpython"""
-    # build the destination pathname, replacing
-    # forward slashes to platform specific separators.
-    # Strip trailing path separator, unless it represents the root.
-    if (targetpath[-1:] in (os.path.sep, os.path.altsep)
-            and len(os.path.splitdrive(targetpath)[1]) > 1):
-        targetpath = targetpath[:-1]
-
-    # don't include leading "/" from file name if present
-    if member.filename[0] == '/':
-        targetpath = os.path.join(targetpath, member.filename[1:])
-    else:
-        targetpath = os.path.join(targetpath, member.filename)
-
-    targetpath = os.path.normpath(targetpath)
-
-    # Create all upper directories if necessary.
-    upperdirs = os.path.dirname(targetpath)
-    if upperdirs and not os.path.exists(upperdirs):
-        os.makedirs(upperdirs)
-
-    if member.filename[-1] == '/':
-        if not os.path.isdir(targetpath):
-            os.mkdir(targetpath)
-        return targetpath
-
-    _extract_from_zip(self, member.filename, targetpath)
-
-    return targetpath
-
-
-def _remove_dir(target):
-
-    #on windows this seems to a problem
-    for dir_path, dirs, files in os.walk(target):
-        os.chmod(dir_path, stat.S_IWRITE)
-        for filename in files:
-            os.chmod(os.path.join(dir_path, filename), stat.S_IWRITE)
-    shutil.rmtree(target)
-
-
-class ZippedEnvironment(unittest.TestCase):
-
-    datafile = None
-    dataname = None
-    old_cwd = None
-
-    def setUp(self):
-        if self.datafile is None or self.dataname is None:
-            return
-
-        if not os.path.isfile(self.datafile):
-            self.old_cwd = None
-            return
-
-        self.old_cwd = os.getcwd()
-
-        self.temp_dir = tempfile.mkdtemp()
-        zip_file, source, target = [None, None, None]
-        try:
-            zip_file = zipfile.ZipFile(self.datafile)
-            for files in zip_file.namelist():
-                _extract(zip_file, files, self.temp_dir)
-        finally:
-            if zip_file:
-                zip_file.close()
-            del zip_file
-
-        os.chdir(os.path.join(self.temp_dir, self.dataname))
-
-    def tearDown(self):
-        #Assume setUp was never completed
-        if self.dataname is None or self.datafile is None:
-            return
-
-        try:
-            if self.old_cwd:
-                os.chdir(self.old_cwd)
-                _remove_dir(self.temp_dir)
-        except OSError:
-            #sigh?
-            pass
-
-
-def _which_dirs(cmd):
-    result = set()
-    for path in os.environ.get('PATH', '').split(os.pathsep):
-        filename = os.path.join(path, cmd)
-        if os.access(filename, os.X_OK):
-            result.add(path)
-    return result
-
-
-def run_setup_py(cmd, pypath=None, path=None,
-                 data_stream=0, env=None):
-    """
-    Execution command for tests, separate from those used by the
-    code directly to prevent accidental behavior issues
-    """
-    if env is None:
-        env = dict()
-        for envname in os.environ:
-            env[envname] = os.environ[envname]
-
-    #override the python path if needed
-    if pypath is not None:
-        env["PYTHONPATH"] = pypath
-
-    #overide the execution path if needed
-    if path is not None:
-        env["PATH"] = path
-    if not env.get("PATH", ""):
-        env["PATH"] = _which_dirs("tar").union(_which_dirs("gzip"))
-        env["PATH"] = os.pathsep.join(env["PATH"])
-
-    cmd = [sys.executable, "setup.py"] + list(cmd)
-
-    #regarding the shell argument, see: http://bugs.python.org/issue8557
-    try:
-        proc = _Popen(cmd, stdout=_PIPE, stderr=_PIPE,
-                      shell=(sys.platform == 'win32'), env=env)
-
-        data = proc.communicate()[data_stream]
-    except OSError:
-        return 1, ''
-
-    #decode the console string if needed
-    if hasattr(data,  "decode"):
-        data = data.decode()  # should use the preffered encoding
-        data = unicodedata.normalize('NFC', data)
-
-    #communciate calls wait()
-    return proc.returncode, data
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/py26compat.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/py26compat.py
deleted file mode 100644
index d4fb891..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/py26compat.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import unittest
-
-try:
-	# provide skipIf for Python 2.4-2.6
-	skipIf = unittest.skipIf
-except AttributeError:
-	def skipIf(condition, reason):
-		def skipper(func):
-			def skip(*args, **kwargs):
-				return
-			if condition:
-				return skip
-			return func
-		return skipper
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/script-with-bom.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/script-with-bom.py
deleted file mode 100644
index 22dee0d..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/script-with-bom.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-result = 'passed'
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/server.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/server.py
deleted file mode 100644
index ae2381e..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/server.py
+++ /dev/null
@@ -1,82 +0,0 @@
-"""Basic http server for tests to simulate PyPI or custom indexes
-"""
-import sys
-import time
-import threading
-from setuptools.compat import BaseHTTPRequestHandler
-from setuptools.compat import (urllib2, URLError, HTTPServer,
-                               SimpleHTTPRequestHandler)
-
-class IndexServer(HTTPServer):
-    """Basic single-threaded http server simulating a package index
-
-    You can use this server in unittest like this::
-        s = IndexServer()
-        s.start()
-        index_url = s.base_url() + 'mytestindex'
-        # do some test requests to the index
-        # The index files should be located in setuptools/tests/indexes
-        s.stop()
-    """
-    def __init__(self, server_address=('', 0),
-            RequestHandlerClass=SimpleHTTPRequestHandler):
-        HTTPServer.__init__(self, server_address, RequestHandlerClass)
-        self._run = True
-
-    def serve(self):
-        while self._run:
-            self.handle_request()
-
-    def start(self):
-        self.thread = threading.Thread(target=self.serve)
-        self.thread.start()
-
-    def stop(self):
-        "Stop the server"
-
-        # Let the server finish the last request and wait for a new one.
-        time.sleep(0.1)
-
-        # self.shutdown is not supported on python < 2.6, so just
-        #  set _run to false, and make a request, causing it to
-        #  terminate.
-        self._run = False
-        url = 'http://127.0.0.1:%(server_port)s/' % vars(self)
-        try:
-            if sys.version_info >= (2, 6):
-                urllib2.urlopen(url, timeout=5)
-            else:
-                urllib2.urlopen(url)
-        except URLError:
-            # ignore any errors; all that's important is the request
-            pass
-        self.thread.join()
-        self.socket.close()
-
-    def base_url(self):
-        port = self.server_port
-        return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port
-
-class RequestRecorder(BaseHTTPRequestHandler):
-    def do_GET(self):
-        requests = vars(self.server).setdefault('requests', [])
-        requests.append(self)
-        self.send_response(200, 'OK')
-
-class MockServer(HTTPServer, threading.Thread):
-    """
-    A simple HTTP Server that records the requests made to it.
-    """
-    def __init__(self, server_address=('', 0),
-            RequestHandlerClass=RequestRecorder):
-        HTTPServer.__init__(self, server_address, RequestHandlerClass)
-        threading.Thread.__init__(self)
-        self.setDaemon(True)
-        self.requests = []
-
-    def run(self):
-        self.serve_forever()
-
-    def url(self):
-        return 'http://localhost:%(server_port)s/' % vars(self)
-    url = property(url)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_bdist_egg.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_bdist_egg.py
deleted file mode 100644
index cf4bcd1..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_bdist_egg.py
+++ /dev/null
@@ -1,72 +0,0 @@
-"""develop tests
-"""
-import os
-import re
-import shutil
-import site
-import sys
-import tempfile
-import unittest
-
-from distutils.errors import DistutilsError
-from setuptools.compat import StringIO
-from setuptools.command.bdist_egg import bdist_egg
-from setuptools.command import easy_install as easy_install_pkg
-from setuptools.dist import Distribution
-
-SETUP_PY = """\
-from setuptools import setup
-
-setup(name='foo', py_modules=['hi'])
-"""
-
-class TestDevelopTest(unittest.TestCase):
-
-    def setUp(self):
-        self.dir = tempfile.mkdtemp()
-        self.old_cwd = os.getcwd()
-        os.chdir(self.dir)
-        f = open('setup.py', 'w')
-        f.write(SETUP_PY)
-        f.close()
-        f = open('hi.py', 'w')
-        f.write('1\n')
-        f.close()
-        if sys.version >= "2.6":
-            self.old_base = site.USER_BASE
-            site.USER_BASE = tempfile.mkdtemp()
-            self.old_site = site.USER_SITE
-            site.USER_SITE = tempfile.mkdtemp()
-
-    def tearDown(self):
-        os.chdir(self.old_cwd)
-        shutil.rmtree(self.dir)
-        if sys.version >= "2.6":
-            shutil.rmtree(site.USER_BASE)
-            shutil.rmtree(site.USER_SITE)
-            site.USER_BASE = self.old_base
-            site.USER_SITE = self.old_site
-
-    def test_bdist_egg(self):
-        dist = Distribution(dict(
-            script_name='setup.py',
-            script_args=['bdist_egg'],
-            name='foo',
-            py_modules=['hi']
-            ))
-        os.makedirs(os.path.join('build', 'src'))
-        old_stdout = sys.stdout
-        sys.stdout = o = StringIO()
-        try:
-            dist.parse_command_line()
-            dist.run_commands()
-        finally:
-            sys.stdout = old_stdout
-
-        # let's see if we got our egg link at the right place
-        [content] = os.listdir('dist')
-        self.assertTrue(re.match('foo-0.0.0-py[23].\d.egg$', content))
-
-def test_suite():
-    return unittest.makeSuite(TestDevelopTest)
-
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_build_ext.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_build_ext.py
deleted file mode 100644
index a92e53a..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_build_ext.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""build_ext tests
-"""
-import unittest
-from distutils.command.build_ext import build_ext as distutils_build_ext
-from setuptools.command.build_ext import build_ext
-from setuptools.dist import Distribution
-
-class TestBuildExtTest(unittest.TestCase):
-
-    def test_get_ext_filename(self):
-        # setuptools needs to give back the same
-        # result than distutils, even if the fullname
-        # is not in ext_map
-        dist = Distribution()
-        cmd = build_ext(dist)
-        cmd.ext_map['foo/bar'] = ''
-        res = cmd.get_ext_filename('foo')
-        wanted = distutils_build_ext.get_ext_filename(cmd, 'foo')
-        assert res == wanted
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_develop.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_develop.py
deleted file mode 100644
index 66d182e..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_develop.py
+++ /dev/null
@@ -1,122 +0,0 @@
-"""develop tests
-"""
-import os
-import shutil
-import site
-import sys
-import tempfile
-import unittest
-
-from distutils.errors import DistutilsError
-from setuptools.command.develop import develop
-from setuptools.dist import Distribution
-
-SETUP_PY = """\
-from setuptools import setup
-
-setup(name='foo',
-    packages=['foo'],
-    use_2to3=True,
-)
-"""
-
-INIT_PY = """print "foo"
-"""
-
-class TestDevelopTest(unittest.TestCase):
-
-    def setUp(self):
-        if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
-            return
-
-        # Directory structure
-        self.dir = tempfile.mkdtemp()
-        os.mkdir(os.path.join(self.dir, 'foo'))
-        # setup.py
-        setup = os.path.join(self.dir, 'setup.py')
-        f = open(setup, 'w')
-        f.write(SETUP_PY)
-        f.close()
-        self.old_cwd = os.getcwd()
-        # foo/__init__.py
-        init = os.path.join(self.dir, 'foo', '__init__.py')
-        f = open(init, 'w')
-        f.write(INIT_PY)
-        f.close()
-
-        os.chdir(self.dir)
-        self.old_base = site.USER_BASE
-        site.USER_BASE = tempfile.mkdtemp()
-        self.old_site = site.USER_SITE
-        site.USER_SITE = tempfile.mkdtemp()
-
-    def tearDown(self):
-        if sys.version < "2.6" or hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix):
-            return
-
-        os.chdir(self.old_cwd)
-        shutil.rmtree(self.dir)
-        shutil.rmtree(site.USER_BASE)
-        shutil.rmtree(site.USER_SITE)
-        site.USER_BASE = self.old_base
-        site.USER_SITE = self.old_site
-
-    def test_develop(self):
-        if sys.version < "2.6" or hasattr(sys, 'real_prefix'):
-            return
-        dist = Distribution(
-            dict(name='foo',
-                 packages=['foo'],
-                 use_2to3=True,
-                 version='0.0',
-                 ))
-        dist.script_name = 'setup.py'
-        cmd = develop(dist)
-        cmd.user = 1
-        cmd.ensure_finalized()
-        cmd.install_dir = site.USER_SITE
-        cmd.user = 1
-        old_stdout = sys.stdout
-        #sys.stdout = StringIO()
-        try:
-            cmd.run()
-        finally:
-            sys.stdout = old_stdout
-
-        # let's see if we got our egg link at the right place
-        content = os.listdir(site.USER_SITE)
-        content.sort()
-        self.assertEqual(content, ['easy-install.pth', 'foo.egg-link'])
-
-        # Check that we are using the right code.
-        egg_link_file = open(os.path.join(site.USER_SITE, 'foo.egg-link'), 'rt')
-        try:
-            path = egg_link_file.read().split()[0].strip()
-        finally:
-            egg_link_file.close()
-        init_file = open(os.path.join(path, 'foo', '__init__.py'), 'rt')
-        try:
-            init = init_file.read().strip()
-        finally:
-            init_file.close()
-        if sys.version < "3":
-            self.assertEqual(init, 'print "foo"')
-        else:
-            self.assertEqual(init, 'print("foo")')
-
-    def notest_develop_with_setup_requires(self):
-
-        wanted = ("Could not find suitable distribution for "
-                  "Requirement.parse('I-DONT-EXIST')")
-        old_dir = os.getcwd()
-        os.chdir(self.dir)
-        try:
-            try:
-                Distribution({'setup_requires': ['I_DONT_EXIST']})
-            except DistutilsError:
-                e = sys.exc_info()[1]
-                error = str(e)
-                if error == wanted:
-                    pass
-        finally:
-            os.chdir(old_dir)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_dist_info.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_dist_info.py
deleted file mode 100644
index a8adb68..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_dist_info.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""Test .dist-info style distributions.
-"""
-import os
-import shutil
-import tempfile
-import unittest
-import textwrap
-
-try:
-    import ast
-except:
-    pass
-
-import pkg_resources
-
-from setuptools.tests.py26compat import skipIf
-
-def DALS(s):
-    "dedent and left-strip"
-    return textwrap.dedent(s).lstrip()
-
-class TestDistInfo(unittest.TestCase):
-
-    def test_distinfo(self):
-        dists = {}
-        for d in pkg_resources.find_distributions(self.tmpdir):
-            dists[d.project_name] = d
-
-        assert len(dists) == 2, dists
-
-        unversioned = dists['UnversionedDistribution']
-        versioned = dists['VersionedDistribution']
-
-        assert versioned.version == '2.718' # from filename
-        assert unversioned.version == '0.3' # from METADATA
-
-    @skipIf('ast' not in globals(),
-        "ast is used to test conditional dependencies (Python >= 2.6)")
-    def test_conditional_dependencies(self):
-        requires = [pkg_resources.Requirement.parse('splort==4'),
-                    pkg_resources.Requirement.parse('quux>=1.1')]
-
-        for d in pkg_resources.find_distributions(self.tmpdir):
-            self.assertEqual(d.requires(), requires[:1])
-            self.assertEqual(d.requires(extras=('baz',)), requires)
-            self.assertEqual(d.extras, ['baz'])
-
-    def setUp(self):
-        self.tmpdir = tempfile.mkdtemp()
-        versioned = os.path.join(self.tmpdir,
-                                 'VersionedDistribution-2.718.dist-info')
-        os.mkdir(versioned)
-        metadata_file = open(os.path.join(versioned, 'METADATA'), 'w+')
-        try:
-            metadata_file.write(DALS(
-                """
-                Metadata-Version: 1.2
-                Name: VersionedDistribution
-                Requires-Dist: splort (4)
-                Provides-Extra: baz
-                Requires-Dist: quux (>=1.1); extra == 'baz'
-                """))
-        finally:
-            metadata_file.close()
-        unversioned = os.path.join(self.tmpdir,
-                                   'UnversionedDistribution.dist-info')
-        os.mkdir(unversioned)
-        metadata_file = open(os.path.join(unversioned, 'METADATA'), 'w+')
-        try:
-            metadata_file.write(DALS(
-                """
-                Metadata-Version: 1.2
-                Name: UnversionedDistribution
-                Version: 0.3
-                Requires-Dist: splort (==4)
-                Provides-Extra: baz
-                Requires-Dist: quux (>=1.1); extra == 'baz'
-                """))
-        finally:
-            metadata_file.close()
-
-    def tearDown(self):
-        shutil.rmtree(self.tmpdir)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_easy_install.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_easy_install.py
deleted file mode 100644
index a443095..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_easy_install.py
+++ /dev/null
@@ -1,462 +0,0 @@
-"""Easy install Tests
-"""
-import sys
-import os
-import shutil
-import tempfile
-import unittest
-import site
-import contextlib
-import textwrap
-import tarfile
-import logging
-import distutils.core
-
-from setuptools.compat import StringIO, BytesIO, urlparse
-from setuptools.sandbox import run_setup, SandboxViolation
-from setuptools.command.easy_install import (
-    easy_install, fix_jython_executable, get_script_args, nt_quote_arg)
-from setuptools.command.easy_install import PthDistributions
-from setuptools.command import easy_install as easy_install_pkg
-from setuptools.dist import Distribution
-from pkg_resources import working_set, VersionConflict
-from pkg_resources import Distribution as PRDistribution
-import setuptools.tests.server
-import pkg_resources
-from .py26compat import skipIf
-
-class FakeDist(object):
-    def get_entry_map(self, group):
-        if group != 'console_scripts':
-            return {}
-        return {'name': 'ep'}
-
-    def as_requirement(self):
-        return 'spec'
-
-WANTED = """\
-#!%s
-# EASY-INSTALL-ENTRY-SCRIPT: 'spec','console_scripts','name'
-__requires__ = 'spec'
-import sys
-from pkg_resources import load_entry_point
-
-if __name__ == '__main__':
-    sys.exit(
-        load_entry_point('spec', 'console_scripts', 'name')()
-    )
-""" % nt_quote_arg(fix_jython_executable(sys.executable, ""))
-
-SETUP_PY = """\
-from setuptools import setup
-
-setup(name='foo')
-"""
-
-class TestEasyInstallTest(unittest.TestCase):
-
-    def test_install_site_py(self):
-        dist = Distribution()
-        cmd = easy_install(dist)
-        cmd.sitepy_installed = False
-        cmd.install_dir = tempfile.mkdtemp()
-        try:
-            cmd.install_site_py()
-            sitepy = os.path.join(cmd.install_dir, 'site.py')
-            self.assertTrue(os.path.exists(sitepy))
-        finally:
-            shutil.rmtree(cmd.install_dir)
-
-    def test_get_script_args(self):
-        dist = FakeDist()
-
-        old_platform = sys.platform
-        try:
-            name, script = [i for i in next(get_script_args(dist))][0:2]
-        finally:
-            sys.platform = old_platform
-
-        self.assertEqual(script, WANTED)
-
-    def test_no_find_links(self):
-        # new option '--no-find-links', that blocks find-links added at
-        # the project level
-        dist = Distribution()
-        cmd = easy_install(dist)
-        cmd.check_pth_processing = lambda: True
-        cmd.no_find_links = True
-        cmd.find_links = ['link1', 'link2']
-        cmd.install_dir = os.path.join(tempfile.mkdtemp(), 'ok')
-        cmd.args = ['ok']
-        cmd.ensure_finalized()
-        self.assertEqual(cmd.package_index.scanned_urls, {})
-
-        # let's try without it (default behavior)
-        cmd = easy_install(dist)
-        cmd.check_pth_processing = lambda: True
-        cmd.find_links = ['link1', 'link2']
-        cmd.install_dir = os.path.join(tempfile.mkdtemp(), 'ok')
-        cmd.args = ['ok']
-        cmd.ensure_finalized()
-        keys = sorted(cmd.package_index.scanned_urls.keys())
-        self.assertEqual(keys, ['link1', 'link2'])
-
-
-class TestPTHFileWriter(unittest.TestCase):
-    def test_add_from_cwd_site_sets_dirty(self):
-        '''a pth file manager should set dirty
-        if a distribution is in site but also the cwd
-        '''
-        pth = PthDistributions('does-not_exist', [os.getcwd()])
-        self.assertTrue(not pth.dirty)
-        pth.add(PRDistribution(os.getcwd()))
-        self.assertTrue(pth.dirty)
-
-    def test_add_from_site_is_ignored(self):
-        if os.name != 'nt':
-            location = '/test/location/does-not-have-to-exist'
-        else:
-            location = 'c:\\does_not_exist'
-        pth = PthDistributions('does-not_exist', [location, ])
-        self.assertTrue(not pth.dirty)
-        pth.add(PRDistribution(location))
-        self.assertTrue(not pth.dirty)
-
-
-class TestUserInstallTest(unittest.TestCase):
-
-    def setUp(self):
-        self.dir = tempfile.mkdtemp()
-        setup = os.path.join(self.dir, 'setup.py')
-        f = open(setup, 'w')
-        f.write(SETUP_PY)
-        f.close()
-        self.old_cwd = os.getcwd()
-        os.chdir(self.dir)
-
-        self.old_enable_site = site.ENABLE_USER_SITE
-        self.old_file = easy_install_pkg.__file__
-        self.old_base = site.USER_BASE
-        site.USER_BASE = tempfile.mkdtemp()
-        self.old_site = site.USER_SITE
-        site.USER_SITE = tempfile.mkdtemp()
-        easy_install_pkg.__file__ = site.USER_SITE
-
-    def tearDown(self):
-        os.chdir(self.old_cwd)
-        shutil.rmtree(self.dir)
-
-        shutil.rmtree(site.USER_BASE)
-        shutil.rmtree(site.USER_SITE)
-        site.USER_BASE = self.old_base
-        site.USER_SITE = self.old_site
-        site.ENABLE_USER_SITE = self.old_enable_site
-        easy_install_pkg.__file__ = self.old_file
-
-    def test_user_install_implied(self):
-        site.ENABLE_USER_SITE = True # disabled sometimes
-        #XXX: replace with something meaningfull
-        dist = Distribution()
-        dist.script_name = 'setup.py'
-        cmd = easy_install(dist)
-        cmd.args = ['py']
-        cmd.ensure_finalized()
-        self.assertTrue(cmd.user, 'user should be implied')
-
-    def test_multiproc_atexit(self):
-        try:
-            __import__('multiprocessing')
-        except ImportError:
-            # skip the test if multiprocessing is not available
-            return
-
-        log = logging.getLogger('test_easy_install')
-        logging.basicConfig(level=logging.INFO, stream=sys.stderr)
-        log.info('this should not break')
-
-    def test_user_install_not_implied_without_usersite_enabled(self):
-        site.ENABLE_USER_SITE = False # usually enabled
-        #XXX: replace with something meaningfull
-        dist = Distribution()
-        dist.script_name = 'setup.py'
-        cmd = easy_install(dist)
-        cmd.args = ['py']
-        cmd.initialize_options()
-        self.assertFalse(cmd.user, 'NOT user should be implied')
-
-    def test_local_index(self):
-        # make sure the local index is used
-        # when easy_install looks for installed
-        # packages
-        new_location = tempfile.mkdtemp()
-        target = tempfile.mkdtemp()
-        egg_file = os.path.join(new_location, 'foo-1.0.egg-info')
-        f = open(egg_file, 'w')
-        try:
-            f.write('Name: foo\n')
-        finally:
-            f.close()
-
-        sys.path.append(target)
-        old_ppath = os.environ.get('PYTHONPATH')
-        os.environ['PYTHONPATH'] = os.path.pathsep.join(sys.path)
-        try:
-            dist = Distribution()
-            dist.script_name = 'setup.py'
-            cmd = easy_install(dist)
-            cmd.install_dir = target
-            cmd.args = ['foo']
-            cmd.ensure_finalized()
-            cmd.local_index.scan([new_location])
-            res = cmd.easy_install('foo')
-            actual = os.path.normcase(os.path.realpath(res.location))
-            expected = os.path.normcase(os.path.realpath(new_location))
-            self.assertEqual(actual, expected)
-        finally:
-            sys.path.remove(target)
-            for basedir in [new_location, target, ]:
-                if not os.path.exists(basedir) or not os.path.isdir(basedir):
-                    continue
-                try:
-                    shutil.rmtree(basedir)
-                except:
-                    pass
-            if old_ppath is not None:
-                os.environ['PYTHONPATH'] = old_ppath
-            else:
-                del os.environ['PYTHONPATH']
-
-    def test_setup_requires(self):
-        """Regression test for Distribute issue #318
-
-        Ensure that a package with setup_requires can be installed when
-        setuptools is installed in the user site-packages without causing a
-        SandboxViolation.
-        """
-
-        test_pkg = create_setup_requires_package(self.dir)
-        test_setup_py = os.path.join(test_pkg, 'setup.py')
-
-        try:
-            with quiet_context():
-                with reset_setup_stop_context():
-                    run_setup(test_setup_py, ['install'])
-        except SandboxViolation:
-            self.fail('Installation caused SandboxViolation')
-        except IndexError:
-            # Test fails in some cases due to bugs in Python
-            # See https://bitbucket.org/pypa/setuptools/issue/201
-            pass
-
-
-class TestSetupRequires(unittest.TestCase):
-
-    def test_setup_requires_honors_fetch_params(self):
-        """
-        When easy_install installs a source distribution which specifies
-        setup_requires, it should honor the fetch parameters (such as
-        allow-hosts, index-url, and find-links).
-        """
-        # set up a server which will simulate an alternate package index.
-        p_index = setuptools.tests.server.MockServer()
-        p_index.start()
-        netloc = 1
-        p_index_loc = urlparse(p_index.url)[netloc]
-        if p_index_loc.endswith(':0'):
-            # Some platforms (Jython) don't find a port to which to bind,
-            #  so skip this test for them.
-            return
-        with quiet_context():
-            # create an sdist that has a build-time dependency.
-            with TestSetupRequires.create_sdist() as dist_file:
-                with tempdir_context() as temp_install_dir:
-                    with environment_context(PYTHONPATH=temp_install_dir):
-                        ei_params = ['--index-url', p_index.url,
-                            '--allow-hosts', p_index_loc,
-                            '--exclude-scripts', '--install-dir', temp_install_dir,
-                            dist_file]
-                        with reset_setup_stop_context():
-                            with argv_context(['easy_install']):
-                                # attempt to install the dist. It should fail because
-                                #  it doesn't exist.
-                                self.assertRaises(SystemExit,
-                                    easy_install_pkg.main, ei_params)
-        # there should have been two or three requests to the server
-        #  (three happens on Python 3.3a)
-        self.assertTrue(2 <= len(p_index.requests) <= 3)
-        self.assertEqual(p_index.requests[0].path, '/does-not-exist/')
-
-    @staticmethod
-    @contextlib.contextmanager
-    def create_sdist():
-        """
-        Return an sdist with a setup_requires dependency (of something that
-        doesn't exist)
-        """
-        with tempdir_context() as dir:
-            dist_path = os.path.join(dir, 'setuptools-test-fetcher-1.0.tar.gz')
-            make_trivial_sdist(
-                dist_path,
-                textwrap.dedent("""
-                    import setuptools
-                    setuptools.setup(
-                        name="setuptools-test-fetcher",
-                        version="1.0",
-                        setup_requires = ['does-not-exist'],
-                    )
-                """).lstrip())
-            yield dist_path
-
-    def test_setup_requires_overrides_version_conflict(self):
-        """
-        Regression test for issue #323.
-
-        Ensures that a distribution's setup_requires requirements can still be
-        installed and used locally even if a conflicting version of that
-        requirement is already on the path.
-        """
-
-        pr_state = pkg_resources.__getstate__()
-        fake_dist = PRDistribution('does-not-matter', project_name='foobar',
-                                   version='0.0')
-        working_set.add(fake_dist)
-
-        try:
-            with tempdir_context() as temp_dir:
-                test_pkg = create_setup_requires_package(temp_dir)
-                test_setup_py = os.path.join(test_pkg, 'setup.py')
-                with quiet_context() as (stdout, stderr):
-                    with reset_setup_stop_context():
-                        try:
-                            # Don't even need to install the package, just
-                            # running the setup.py at all is sufficient
-                            run_setup(test_setup_py, ['--name'])
-                        except VersionConflict:
-                            self.fail('Installing setup.py requirements '
-                                'caused a VersionConflict')
-
-                lines = stdout.readlines()
-                self.assertTrue(len(lines) > 0)
-                self.assertTrue(lines[-1].strip(), 'test_pkg')
-        finally:
-            pkg_resources.__setstate__(pr_state)
-
-
-def create_setup_requires_package(path):
-    """Creates a source tree under path for a trivial test package that has a
-    single requirement in setup_requires--a tarball for that requirement is
-    also created and added to the dependency_links argument.
-    """
-
-    test_setup_attrs = {
-        'name': 'test_pkg', 'version': '0.0',
-        'setup_requires': ['foobar==0.1'],
-        'dependency_links': [os.path.abspath(path)]
-    }
-
-    test_pkg = os.path.join(path, 'test_pkg')
-    test_setup_py = os.path.join(test_pkg, 'setup.py')
-    os.mkdir(test_pkg)
-
-    f = open(test_setup_py, 'w')
-    f.write(textwrap.dedent("""\
-        import setuptools
-        setuptools.setup(**%r)
-    """ % test_setup_attrs))
-    f.close()
-
-    foobar_path = os.path.join(path, 'foobar-0.1.tar.gz')
-    make_trivial_sdist(
-        foobar_path,
-        textwrap.dedent("""\
-            import setuptools
-            setuptools.setup(
-                name='foobar',
-                version='0.1'
-            )
-        """))
-
-    return test_pkg
-
-
-def make_trivial_sdist(dist_path, setup_py):
-    """Create a simple sdist tarball at dist_path, containing just a
-    setup.py, the contents of which are provided by the setup_py string.
-    """
-
-    setup_py_file = tarfile.TarInfo(name='setup.py')
-    try:
-        # Python 3 (StringIO gets converted to io module)
-        MemFile = BytesIO
-    except AttributeError:
-        MemFile = StringIO
-    setup_py_bytes = MemFile(setup_py.encode('utf-8'))
-    setup_py_file.size = len(setup_py_bytes.getvalue())
-    dist = tarfile.open(dist_path, 'w:gz')
-    try:
-        dist.addfile(setup_py_file, fileobj=setup_py_bytes)
-    finally:
-        dist.close()
-
-
-@contextlib.contextmanager
-def tempdir_context(cd=lambda dir:None):
-    temp_dir = tempfile.mkdtemp()
-    orig_dir = os.getcwd()
-    try:
-        cd(temp_dir)
-        yield temp_dir
-    finally:
-        cd(orig_dir)
-        shutil.rmtree(temp_dir)
-
-@contextlib.contextmanager
-def environment_context(**updates):
-    old_env = os.environ.copy()
-    os.environ.update(updates)
-    try:
-        yield
-    finally:
-        for key in updates:
-            del os.environ[key]
-        os.environ.update(old_env)
-
-@contextlib.contextmanager
-def argv_context(repl):
-    old_argv = sys.argv[:]
-    sys.argv[:] = repl
-    yield
-    sys.argv[:] = old_argv
-
-@contextlib.contextmanager
-def reset_setup_stop_context():
-    """
-    When the setuptools tests are run using setup.py test, and then
-    one wants to invoke another setup() command (such as easy_install)
-    within those tests, it's necessary to reset the global variable
-    in distutils.core so that the setup() command will run naturally.
-    """
-    setup_stop_after = distutils.core._setup_stop_after
-    distutils.core._setup_stop_after = None
-    yield
-    distutils.core._setup_stop_after = setup_stop_after
-
-
-@contextlib.contextmanager
-def quiet_context():
-    """
-    Redirect stdout/stderr to StringIO objects to prevent console output from
-    distutils commands.
-    """
-
-    old_stdout = sys.stdout
-    old_stderr = sys.stderr
-    new_stdout = sys.stdout = StringIO()
-    new_stderr = sys.stderr = StringIO()
-    try:
-        yield new_stdout, new_stderr
-    finally:
-        new_stdout.seek(0)
-        new_stderr.seek(0)
-        sys.stdout = old_stdout
-        sys.stderr = old_stderr
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_egg_info.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_egg_info.py
deleted file mode 100644
index 7531e37..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_egg_info.py
+++ /dev/null
@@ -1,210 +0,0 @@
-
-import os
-import sys
-import tempfile
-import shutil
-import unittest
-
-import pkg_resources
-import warnings
-from setuptools.command import egg_info
-from setuptools import svn_utils
-from setuptools.tests import environment, test_svn
-from setuptools.tests.py26compat import skipIf
-
-ENTRIES_V10 = pkg_resources.resource_string(__name__, 'entries-v10')
-"An entries file generated with svn 1.6.17 against the legacy Setuptools repo"
-
-
-class TestEggInfo(unittest.TestCase):
-
-    def setUp(self):
-        self.test_dir = tempfile.mkdtemp()
-        os.mkdir(os.path.join(self.test_dir, '.svn'))
-
-        self.old_cwd = os.getcwd()
-        os.chdir(self.test_dir)
-
-    def tearDown(self):
-        os.chdir(self.old_cwd)
-        shutil.rmtree(self.test_dir)
-
-    def _write_entries(self, entries):
-        fn = os.path.join(self.test_dir, '.svn', 'entries')
-        entries_f = open(fn, 'wb')
-        entries_f.write(entries)
-        entries_f.close()
-   
-    @skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
-    def test_version_10_format(self):
-        """
-        """
-        #keeping this set for 1.6 is a good check on the get_svn_revision
-        #to ensure I return using svnversion what would had been returned
-        version_str = svn_utils.SvnInfo.get_svn_version()
-        version = [int(x) for x in version_str.split('.')[:2]]
-        if version != [1, 6]:
-            if hasattr(self, 'skipTest'):
-                self.skipTest('')
-            else:
-                sys.stderr.write('\n   Skipping due to SVN Version\n')
-                return
-
-        self._write_entries(ENTRIES_V10)
-        rev = egg_info.egg_info.get_svn_revision()
-        self.assertEqual(rev, '89000')
-
-    def test_version_10_format_legacy_parser(self):
-        """
-        """
-        path_variable = None
-        for env in os.environ:
-            if env.lower() == 'path':
-                path_variable = env
-
-        if path_variable:
-            old_path = os.environ[path_variable]
-            os.environ[path_variable] = ''
-        #catch_warnings not available until py26
-        warning_filters = warnings.filters
-        warnings.filters = warning_filters[:]
-        try:
-            warnings.simplefilter("ignore", DeprecationWarning)
-            self._write_entries(ENTRIES_V10)
-            rev = egg_info.egg_info.get_svn_revision()
-        finally:
-            #restore the warning filters
-            warnings.filters = warning_filters
-            #restore the os path
-            if path_variable:
-                os.environ[path_variable] = old_path
-
-        self.assertEqual(rev, '89000')
-
-DUMMY_SOURCE_TXT = """CHANGES.txt
-CONTRIBUTORS.txt
-HISTORY.txt
-LICENSE
-MANIFEST.in
-README.txt
-setup.py
-dummy/__init__.py
-dummy/test.txt
-dummy.egg-info/PKG-INFO
-dummy.egg-info/SOURCES.txt
-dummy.egg-info/dependency_links.txt
-dummy.egg-info/top_level.txt"""
-
-
-class TestSvnDummy(environment.ZippedEnvironment):
-
-    def setUp(self):
-        version = svn_utils.SvnInfo.get_svn_version()
-        if not version:  # None or Empty
-            return None
-
-        self.base_version = tuple([int(x) for x in version.split('.')][:2])
-
-        if not self.base_version:
-            raise ValueError('No SVN tools installed')
-        elif self.base_version < (1, 3):
-            raise ValueError('Insufficient SVN Version %s' % version)
-        elif self.base_version >= (1, 9):
-            #trying the latest version
-            self.base_version = (1, 8)
-
-        self.dataname = "dummy%i%i" % self.base_version
-        self.datafile = os.path.join('setuptools', 'tests',
-                                     'svn_data', self.dataname + ".zip")
-        super(TestSvnDummy, self).setUp()
-
-    @skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
-    def test_sources(self):
-        code, data = environment.run_setup_py(["sdist"],
-                                              pypath=self.old_cwd,
-                                              data_stream=1)
-        if code:
-            raise AssertionError(data)
-
-        sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
-        infile = open(sources, 'r')
-        try:
-            read_contents = infile.read()
-        finally:
-            infile.close()
-            del infile
-
-        self.assertEqual(DUMMY_SOURCE_TXT, read_contents)
-
-        return data
-
-    @skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
-    def test_svn_tags(self):
-        code, data = environment.run_setup_py(["egg_info", 
-                                               "--tag-svn-revision"],
-                                              pypath=self.old_cwd,
-                                              data_stream=1)
-        if code:
-            raise AssertionError(data)
-
-        pkginfo = os.path.join('dummy.egg-info', 'PKG-INFO')
-        infile = open(pkginfo, 'r')
-        try:
-            read_contents = infile.readlines()
-        finally:
-            infile.close()
-            del infile
-
-        self.assertTrue("Version: 0.1.1-r1\n" in read_contents)
-
-    @skipIf(not test_svn._svn_check, "No SVN to text, in the first place")
-    def test_no_tags(self):
-        code, data = environment.run_setup_py(["egg_info"],
-                                              pypath=self.old_cwd,
-                                              data_stream=1)
-        if code:
-            raise AssertionError(data)
-
-        pkginfo = os.path.join('dummy.egg-info', 'PKG-INFO')
-        infile = open(pkginfo, 'r')
-        try:
-            read_contents = infile.readlines()
-        finally:
-            infile.close()
-            del infile
-
-        self.assertTrue("Version: 0.1.1\n" in read_contents)
-
-
-class TestSvnDummyLegacy(environment.ZippedEnvironment):
-
-    def setUp(self):
-        self.base_version = (1, 6)
-        self.dataname = "dummy%i%i" % self.base_version
-        self.datafile = os.path.join('setuptools', 'tests',
-                                     'svn_data', self.dataname + ".zip")
-        super(TestSvnDummyLegacy, self).setUp()
-
-    def test_sources(self):
-        code, data = environment.run_setup_py(["sdist"],
-                                              pypath=self.old_cwd,
-                                              path="",
-                                              data_stream=1)
-        if code:
-            raise AssertionError(data)
-
-        sources = os.path.join('dummy.egg-info', 'SOURCES.txt')
-        infile = open(sources, 'r')
-        try:
-            read_contents = infile.read()
-        finally:
-            infile.close()
-            del infile
-
-        self.assertEqual(DUMMY_SOURCE_TXT, read_contents)
-
-        return data
-
-
-def test_suite():
-    return unittest.defaultTestLoader.loadTestsFromName(__name__)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_find_packages.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_find_packages.py
deleted file mode 100644
index fe39072..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_find_packages.py
+++ /dev/null
@@ -1,170 +0,0 @@
-"""Tests for setuptools.find_packages()."""
-import os
-import sys
-import shutil
-import tempfile
-import unittest
-import platform
-
-import setuptools
-from setuptools import find_packages
-from setuptools.tests.py26compat import skipIf
-
-find_420_packages = setuptools.PEP420PackageFinder.find
-
-# modeled after CPython's test.support.can_symlink
-def can_symlink():
-    TESTFN = tempfile.mktemp()
-    symlink_path = TESTFN + "can_symlink"
-    try:
-        os.symlink(TESTFN, symlink_path)
-        can = True
-    except (OSError, NotImplementedError, AttributeError):
-        can = False
-    else:
-        os.remove(symlink_path)
-    globals().update(can_symlink=lambda: can)
-    return can
-
-def has_symlink():
-    bad_symlink = (
-        # Windows symlink directory detection is broken on Python 3.2
-        platform.system() == 'Windows' and sys.version_info[:2] == (3,2)
-    )
-    return can_symlink() and not bad_symlink
-
-class TestFindPackages(unittest.TestCase):
-
-    def setUp(self):
-        self.dist_dir = tempfile.mkdtemp()
-        self._make_pkg_structure()
-
-    def tearDown(self):
-        shutil.rmtree(self.dist_dir)
-
-    def _make_pkg_structure(self):
-        """Make basic package structure.
-
-        dist/
-            docs/
-                conf.py
-            pkg/
-                __pycache__/
-                nspkg/
-                    mod.py
-                subpkg/
-                    assets/
-                        asset
-                    __init__.py
-            setup.py
-
-        """
-        self.docs_dir = self._mkdir('docs', self.dist_dir)
-        self._touch('conf.py', self.docs_dir)
-        self.pkg_dir = self._mkdir('pkg', self.dist_dir)
-        self._mkdir('__pycache__', self.pkg_dir)
-        self.ns_pkg_dir = self._mkdir('nspkg', self.pkg_dir)
-        self._touch('mod.py', self.ns_pkg_dir)
-        self.sub_pkg_dir = self._mkdir('subpkg', self.pkg_dir)
-        self.asset_dir = self._mkdir('assets', self.sub_pkg_dir)
-        self._touch('asset', self.asset_dir)
-        self._touch('__init__.py', self.sub_pkg_dir)
-        self._touch('setup.py', self.dist_dir)
-
-    def _mkdir(self, path, parent_dir=None):
-        if parent_dir:
-            path = os.path.join(parent_dir, path)
-        os.mkdir(path)
-        return path
-
-    def _touch(self, path, dir_=None):
-        if dir_:
-            path = os.path.join(dir_, path)
-        fp = open(path, 'w')
-        fp.close()
-        return path
-
-    def test_regular_package(self):
-        self._touch('__init__.py', self.pkg_dir)
-        packages = find_packages(self.dist_dir)
-        self.assertEqual(packages, ['pkg', 'pkg.subpkg'])
-
-    def test_exclude(self):
-        self._touch('__init__.py', self.pkg_dir)
-        packages = find_packages(self.dist_dir, exclude=('pkg.*',))
-        assert packages == ['pkg']
-
-    def test_include_excludes_other(self):
-        """
-        If include is specified, other packages should be excluded.
-        """
-        self._touch('__init__.py', self.pkg_dir)
-        alt_dir = self._mkdir('other_pkg', self.dist_dir)
-        self._touch('__init__.py', alt_dir)
-        packages = find_packages(self.dist_dir, include=['other_pkg'])
-        self.assertEqual(packages, ['other_pkg'])
-
-    def test_dir_with_dot_is_skipped(self):
-        shutil.rmtree(os.path.join(self.dist_dir, 'pkg/subpkg/assets'))
-        data_dir = self._mkdir('some.data', self.pkg_dir)
-        self._touch('__init__.py', data_dir)
-        self._touch('file.dat', data_dir)
-        packages = find_packages(self.dist_dir)
-        self.assertTrue('pkg.some.data' not in packages)
-
-    def test_dir_with_packages_in_subdir_is_excluded(self):
-        """
-        Ensure that a package in a non-package such as build/pkg/__init__.py
-        is excluded.
-        """
-        build_dir = self._mkdir('build', self.dist_dir)
-        build_pkg_dir = self._mkdir('pkg', build_dir)
-        self._touch('__init__.py', build_pkg_dir)
-        packages = find_packages(self.dist_dir)
-        self.assertTrue('build.pkg' not in packages)
-
-    @skipIf(not has_symlink(), 'Symlink support required')
-    def test_symlinked_packages_are_included(self):
-        """
-        A symbolically-linked directory should be treated like any other
-        directory when matched as a package.
-
-        Create a link from lpkg -> pkg.
-        """
-        self._touch('__init__.py', self.pkg_dir)
-        linked_pkg = os.path.join(self.dist_dir, 'lpkg')
-        os.symlink('pkg', linked_pkg)
-        assert os.path.isdir(linked_pkg)
-        packages = find_packages(self.dist_dir)
-        self.assertTrue('lpkg' in packages)
-
-    def _assert_packages(self, actual, expected):
-        self.assertEqual(set(actual), set(expected))
-
-    def test_pep420_ns_package(self):
-        packages = find_420_packages(
-            self.dist_dir, include=['pkg*'], exclude=['pkg.subpkg.assets'])
-        self._assert_packages(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg'])
-
-    def test_pep420_ns_package_no_includes(self):
-        packages = find_420_packages(
-            self.dist_dir, exclude=['pkg.subpkg.assets'])
-        self._assert_packages(packages, ['docs', 'pkg', 'pkg.nspkg', 'pkg.subpkg'])
-
-    def test_pep420_ns_package_no_includes_or_excludes(self):
-        packages = find_420_packages(self.dist_dir)
-        expected = [
-            'docs', 'pkg', 'pkg.nspkg', 'pkg.subpkg', 'pkg.subpkg.assets']
-        self._assert_packages(packages, expected)
-
-    def test_regular_package_with_nested_pep420_ns_packages(self):
-        self._touch('__init__.py', self.pkg_dir)
-        packages = find_420_packages(
-            self.dist_dir, exclude=['docs', 'pkg.subpkg.assets'])
-        self._assert_packages(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg'])
-
-    def test_pep420_ns_package_no_non_package_dirs(self):
-        shutil.rmtree(self.docs_dir)
-        shutil.rmtree(os.path.join(self.dist_dir, 'pkg/subpkg/assets'))
-        packages = find_420_packages(self.dist_dir)
-        self._assert_packages(packages, ['pkg', 'pkg.nspkg', 'pkg.subpkg'])
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_integration.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_integration.py
deleted file mode 100644
index 8d6c1e5..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_integration.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""Run some integration tests.
-
-Try to install a few packages.
-"""
-
-import glob
-import os
-import sys
-
-import pytest
-
-from setuptools.command.easy_install import easy_install
-from setuptools.command import easy_install as easy_install_pkg
-from setuptools.dist import Distribution
-
-
-@pytest.fixture
-def install_context(request, tmpdir, monkeypatch):
-    """Fixture to set up temporary installation directory.
-    """
-    # Save old values so we can restore them.
-    new_cwd = tmpdir.mkdir('cwd')
-    user_base = tmpdir.mkdir('user_base')
-    user_site = tmpdir.mkdir('user_site')
-    install_dir = tmpdir.mkdir('install_dir')
-
-    def fin():
-        # undo the monkeypatch, particularly needed under
-        # windows because of kept handle on cwd
-        monkeypatch.undo() 
-        new_cwd.remove()
-        user_base.remove()
-        user_site.remove()
-        install_dir.remove()
-    request.addfinalizer(fin)
-
-    # Change the environment and site settings to control where the
-    # files are installed and ensure we do not overwrite anything.
-    monkeypatch.chdir(new_cwd)
-    monkeypatch.setattr(easy_install_pkg, '__file__', user_site.strpath)
-    monkeypatch.setattr('site.USER_BASE', user_base.strpath)
-    monkeypatch.setattr('site.USER_SITE', user_site.strpath)
-    monkeypatch.setattr('sys.path', sys.path + [install_dir.strpath])
-    monkeypatch.setenv('PYTHONPATH', os.path.pathsep.join(sys.path))
-
-    # Set up the command for performing the installation.
-    dist = Distribution()
-    cmd = easy_install(dist)
-    cmd.install_dir = install_dir.strpath
-    return cmd
-
-
-def _install_one(requirement, cmd, pkgname, modulename):
-    cmd.args = [requirement]
-    cmd.ensure_finalized()
-    cmd.run()
-    target = cmd.install_dir
-    dest_path = glob.glob(os.path.join(target, pkgname + '*.egg'))
-    assert dest_path
-    assert os.path.exists(os.path.join(dest_path[0], pkgname, modulename))
-
-
-def test_stevedore(install_context):
-    _install_one('stevedore', install_context,
-                 'stevedore', 'extension.py')
-
-
-@pytest.mark.xfail
-def test_virtualenvwrapper(install_context):
-    _install_one('virtualenvwrapper', install_context,
-                 'virtualenvwrapper', 'hook_loader.py')
-
-
-@pytest.mark.xfail
-def test_pbr(install_context):
-    _install_one('pbr', install_context,
-                 'pbr', 'core.py')
-
-
-@pytest.mark.xfail
-def test_python_novaclient(install_context):
-    _install_one('python-novaclient', install_context,
-                 'novaclient', 'base.py')
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_markerlib.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_markerlib.py
deleted file mode 100644
index dae71cb..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_markerlib.py
+++ /dev/null
@@ -1,68 +0,0 @@
-import os
-import unittest
-from setuptools.tests.py26compat import skipIf
-
-try:
-    import ast
-except ImportError:
-    pass
-
-class TestMarkerlib(unittest.TestCase):
-
-    @skipIf('ast' not in globals(),
-        "ast not available (Python < 2.6?)")
-    def test_markers(self):
-        from _markerlib import interpret, default_environment, compile
-        
-        os_name = os.name
-        
-        self.assertTrue(interpret(""))
-        
-        self.assertTrue(interpret("os.name != 'buuuu'"))
-        self.assertTrue(interpret("os_name != 'buuuu'"))
-        self.assertTrue(interpret("python_version > '1.0'"))
-        self.assertTrue(interpret("python_version < '5.0'"))
-        self.assertTrue(interpret("python_version <= '5.0'"))
-        self.assertTrue(interpret("python_version >= '1.0'"))
-        self.assertTrue(interpret("'%s' in os.name" % os_name))
-        self.assertTrue(interpret("'%s' in os_name" % os_name))
-        self.assertTrue(interpret("'buuuu' not in os.name"))
-        
-        self.assertFalse(interpret("os.name == 'buuuu'"))
-        self.assertFalse(interpret("os_name == 'buuuu'"))
-        self.assertFalse(interpret("python_version < '1.0'"))
-        self.assertFalse(interpret("python_version > '5.0'"))
-        self.assertFalse(interpret("python_version >= '5.0'"))
-        self.assertFalse(interpret("python_version <= '1.0'"))
-        self.assertFalse(interpret("'%s' not in os.name" % os_name))
-        self.assertFalse(interpret("'buuuu' in os.name and python_version >= '5.0'"))    
-        self.assertFalse(interpret("'buuuu' in os_name and python_version >= '5.0'"))    
-        
-        environment = default_environment()
-        environment['extra'] = 'test'
-        self.assertTrue(interpret("extra == 'test'", environment))
-        self.assertFalse(interpret("extra == 'doc'", environment))
-        
-        def raises_nameError():
-            try:
-                interpret("python.version == '42'")
-            except NameError:
-                pass
-            else:
-                raise Exception("Expected NameError")
-        
-        raises_nameError()
-        
-        def raises_syntaxError():
-            try:
-                interpret("(x for x in (4,))")
-            except SyntaxError:
-                pass
-            else:
-                raise Exception("Expected SyntaxError")
-            
-        raises_syntaxError()
-        
-        statement = "python_version == '5'"
-        self.assertEqual(compile(statement).__doc__, statement)
-        
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_msvc9compiler.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_msvc9compiler.py
deleted file mode 100644
index 970f767..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_msvc9compiler.py
+++ /dev/null
@@ -1,157 +0,0 @@
-"""msvc9compiler monkey patch test
-
-This test ensures that importing setuptools is sufficient to replace
-the standard find_vcvarsall function with our patched version that
-finds the Visual C++ for Python package.
-"""
-
-import os
-import shutil
-import sys
-import tempfile
-import unittest
-import distutils.errors
-import contextlib
-
-# importing only setuptools should apply the patch
-__import__('setuptools')
-
-class MockReg:
-    """Mock for distutils.msvc9compiler.Reg. We patch it
-    with an instance of this class that mocks out the
-    functions that access the registry.
-    """
-
-    def __init__(self, hkey_local_machine={}, hkey_current_user={}):
-        self.hklm = hkey_local_machine
-        self.hkcu = hkey_current_user
-
-    def __enter__(self):
-        self.original_read_keys = distutils.msvc9compiler.Reg.read_keys
-        self.original_read_values = distutils.msvc9compiler.Reg.read_values
-
-        _winreg = getattr(distutils.msvc9compiler, '_winreg', None)
-        winreg = getattr(distutils.msvc9compiler, 'winreg', _winreg)
-
-        hives = {
-            winreg.HKEY_CURRENT_USER: self.hkcu,
-            winreg.HKEY_LOCAL_MACHINE: self.hklm,
-        }
-
-        def read_keys(cls, base, key):
-            """Return list of registry keys."""
-            hive = hives.get(base, {})
-            return [k.rpartition('\\')[2]
-                    for k in hive if k.startswith(key.lower())]
-
-        def read_values(cls, base, key):
-            """Return dict of registry keys and values."""
-            hive = hives.get(base, {})
-            return dict((k.rpartition('\\')[2], hive[k])
-                        for k in hive if k.startswith(key.lower()))
-
-        distutils.msvc9compiler.Reg.read_keys = classmethod(read_keys)
-        distutils.msvc9compiler.Reg.read_values = classmethod(read_values)
-
-        return self
-
-    def __exit__(self, exc_type, exc_value, exc_tb):
-        distutils.msvc9compiler.Reg.read_keys = self.original_read_keys
-        distutils.msvc9compiler.Reg.read_values = self.original_read_values
-
-@contextlib.contextmanager
-def patch_env(**replacements):
-    """
-    In a context, patch the environment with replacements. Pass None values
-    to clear the values.
-    """
-    saved = dict(
-        (key, os.environ['key'])
-        for key in replacements
-        if key in os.environ
-    )
-
-    # remove values that are null
-    remove = (key for (key, value) in replacements.items() if value is None)
-    for key in list(remove):
-        os.environ.pop(key, None)
-        replacements.pop(key)
-
-    os.environ.update(replacements)
-
-    try:
-        yield saved
-    finally:
-        for key in replacements:
-            os.environ.pop(key, None)
-        os.environ.update(saved)
-
-class TestMSVC9Compiler(unittest.TestCase):
-
-    def test_find_vcvarsall_patch(self):
-        if not hasattr(distutils, 'msvc9compiler'):
-            # skip
-            return
-
-        self.assertEqual(
-            "setuptools.msvc9_support",
-            distutils.msvc9compiler.find_vcvarsall.__module__,
-            "find_vcvarsall was not patched"
-        )
-
-        find_vcvarsall = distutils.msvc9compiler.find_vcvarsall
-        query_vcvarsall = distutils.msvc9compiler.query_vcvarsall
-
-        # No registry entries or environment variable means we should
-        # not find anything
-        with patch_env(VS90COMNTOOLS=None):
-            with MockReg():
-                self.assertIsNone(find_vcvarsall(9.0))
-
-                try:
-                    query_vcvarsall(9.0)
-                    self.fail('Expected DistutilsPlatformError from query_vcvarsall()')
-                except distutils.errors.DistutilsPlatformError:
-                    exc_message = str(sys.exc_info()[1])
-                self.assertIn('aka.ms/vcpython27', exc_message)
-
-        key_32 = r'software\microsoft\devdiv\vcforpython\9.0\installdir'
-        key_64 = r'software\wow6432node\microsoft\devdiv\vcforpython\9.0\installdir'
-
-        # Make two mock files so we can tell whether HCKU entries are
-        # preferred to HKLM entries.
-        mock_installdir_1 = tempfile.mkdtemp()
-        mock_vcvarsall_bat_1 = os.path.join(mock_installdir_1, 'vcvarsall.bat')
-        open(mock_vcvarsall_bat_1, 'w').close()
-        mock_installdir_2 = tempfile.mkdtemp()
-        mock_vcvarsall_bat_2 = os.path.join(mock_installdir_2, 'vcvarsall.bat')
-        open(mock_vcvarsall_bat_2, 'w').close()
-        try:
-            # Ensure we get the current user's setting first
-            with MockReg(
-                hkey_current_user={key_32: mock_installdir_1},
-                hkey_local_machine={
-                    key_32: mock_installdir_2,
-                    key_64: mock_installdir_2,
-                }
-            ):
-                self.assertEqual(mock_vcvarsall_bat_1, find_vcvarsall(9.0))
-
-            # Ensure we get the local machine value if it's there
-            with MockReg(hkey_local_machine={key_32: mock_installdir_2}):
-                self.assertEqual(mock_vcvarsall_bat_2, find_vcvarsall(9.0))
-
-            # Ensure we prefer the 64-bit local machine key
-            # (*not* the Wow6432Node key)
-            with MockReg(
-                hkey_local_machine={
-                    # This *should* only exist on 32-bit machines
-                    key_32: mock_installdir_1,
-                    # This *should* only exist on 64-bit machines
-                    key_64: mock_installdir_2,
-                }
-            ):
-                self.assertEqual(mock_vcvarsall_bat_1, find_vcvarsall(9.0))
-        finally:
-            shutil.rmtree(mock_installdir_1)
-            shutil.rmtree(mock_installdir_2)
diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_packageindex.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_packageindex.py
deleted file mode 100644
index 664566a..0000000
--- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_packageindex.py
+++ /dev/null
@@ -1,203 +0,0 @@
-"""Package Index Tests
-"""
-import sys
-import os
-import unittest
-import pkg_resources
-from setuptools.compat import urllib2, httplib, HTTPError, unicode, pathname2url
-import distutils.errors
-import setuptools.package_index
-from setuptools.tests.server import IndexServer
-
-class TestPackageIndex(unittest.TestCase):
-
-    def test_bad_url_bad_port(self):
-        index = setuptools.package_index.PackageIndex()
-        url = 'http://127.0.0.1:0/nonesuch/test_package_index'
-        try:
-            v = index.open_url(url)
-        except Exception:
-            v = sys.exc_info()[1]
-            self.assertTrue(url in str(v))
-        else:
-            self.assertTrue(isinstance(v, HTTPError))
-
-    def test_bad_url_typo(self):
-        # issue 16
-        # easy_install inquant.contentmirror.plone breaks because of a typo
-        # in its home URL
-        index = setuptools.package_index.PackageIndex(
-            hosts=('www.example.com',)
-        )
-
-        url = 'url:%20https://svn.plone.org/svn/collective/inquant.contentmirror.plone/trunk'
-        try:
-            v = index.open_url(url)
-        except Exception:
-            v = sys.exc_info()[1]
-            self.assertTrue(url in str(v))
-        else:
-            self.assertTrue(isinstance(v, HTTPError))
-
-    def test_bad_url_bad_status_line(self):
-        index = setuptools.package_index.PackageIndex(
-            hosts=('www.example.com',)
-        )
-
-        def _urlopen(*args):
-            raise httplib.BadStatusLine('line')
-
-        index.opener = _urlopen
-        url = 'http://example.com'
-        try:
-            v = index.open_url(url)
-        except Exception:
-            v = sys.exc_info()[1]
-            self.assertTrue('line' in str(v))
-        else:
-            raise AssertionError('Should have raise here!')
-
-    def test_bad_url_double_scheme(self):
-        """
-        A bad URL with a double scheme should raise a DistutilsError.
-        """
-        index = setuptools.package_index.PackageIndex(
-            hosts=('www.example.com',)
-        )
-
-        # issue 20
-        url = 'http://http://svn.pythonpaste.org/Paste/wphp/trunk'
-        try:
-            index.open_url(url)
-        except distutils.errors.DistutilsError:
-            error = sys.exc_info()[1]
-            msg = unicode(error)
-            assert 'nonnumeric port' in msg or 'getaddrinfo failed' in msg or 'Name or service not known' in msg
-            return
-        raise RuntimeError("Did not raise")
-
-    def test_bad_url_screwy_href(self):
-        index = setuptools.package_index.PackageIndex(
-            hosts=('www.example.com',)
-        )
-
-        # issue #160
-        if sys.version_info[0] == 2 and sys.version_info[1] == 7:
-            # this should not fail
-            url = 'http://example.com'
-            page = ('')
-            index.process_index(url, page)
-
-    def test_url_ok(self):
-        index = setuptools.package_index.PackageIndex(
-            hosts=('www.example.com',)
-        )
-        url = 'file:///tmp/test_package_index'
-        self.assertTrue(index.url_ok(url, True))
-
-    def test_links_priority(self):
-        """
-        Download links from the pypi simple index should be used before
-        external download links.
-        https://bitbucket.org/tarek/distribute/issue/163
-
-        Usecase :
-        - someone uploads a package on pypi, a md5 is generated
-        - someone manually copies this link (with the md5 in the url) onto an
-          external page accessible from the package page.
-        - someone reuploads the package (with a different md5)
-        - while easy_installing, an MD5 error occurs because the external link
-          is used
-        -> Setuptools should use the link from pypi, not the external one.
-        """
-        if sys.platform.startswith('java'):
-            # Skip this test on jython because binding to :0 fails
-            return
-
-        # start an index server
-        server = IndexServer()
-        server.start()
-        index_url = server.base_url() + 'test_links_priority/simple/'
-
-        # scan a test index
-        pi = setuptools.package_index.PackageIndex(index_url)
-        requirement = pkg_resources.Requirement.parse('foobar')
-        pi.find_packages(requirement)
-        server.stop()
-
-        # the distribution has been found
-        self.assertTrue('foobar' in pi)
-        # we have only one link, because links are compared without md5
-        self.assertTrue(len(pi['foobar'])==1)
-        # the link should be from the index
-        self.assertTrue('correct_md5' in pi['foobar'][0].location)
-
-    def test_parse_bdist_wininst(self):
-        self.assertEqual(setuptools.package_index.parse_bdist_wininst(
-            'reportlab-2.5.win32-py2.4.exe'), ('reportlab-2.5', '2.4', 'win32'))
-        self.assertEqual(setuptools.package_index.parse_bdist_wininst(
-            'reportlab-2.5.win32.exe'), ('reportlab-2.5', None, 'win32'))
-        self.assertEqual(setuptools.package_index.parse_bdist_wininst(
-            'reportlab-2.5.win-amd64-py2.7.exe'), ('reportlab-2.5', '2.7', 'win-amd64'))
-        self.assertEqual(setuptools.package_index.parse_bdist_wininst(
-            'reportlab-2.5.win-amd64.exe'), ('reportlab-2.5', None, 'win-amd64'))
-
-    def test__vcs_split_rev_from_url(self):
-        """
-        Test the basic usage of _vcs_split_rev_from_url
-        """
-        vsrfu = setuptools.package_index.PackageIndex._vcs_split_rev_from_url
-        url, rev = vsrfu('https://example.com/bar@2995')
-        self.assertEqual(url, 'https://example.com/bar')
-        self.assertEqual(rev, '2995')
-
-    def test_local_index(self):
-        """
-        local_open should be able to read an index from the file system.
-        """
-        f = open('index.html', 'w')
-        f.write('
content
') - f.close() - try: - url = 'file:' + pathname2url(os.getcwd()) + '/' - res = setuptools.package_index.local_open(url) - finally: - os.remove('index.html') - assert 'content' in res.read() - - -class TestContentCheckers(unittest.TestCase): - - def test_md5(self): - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - checker.feed('You should probably not be using MD5'.encode('ascii')) - self.assertEqual(checker.hash.hexdigest(), - 'f12895fdffbd45007040d2e44df98478') - self.assertTrue(checker.is_valid()) - - def test_other_fragment(self): - "Content checks should succeed silently if no hash is present" - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#something%20completely%20different') - checker.feed('anything'.encode('ascii')) - self.assertTrue(checker.is_valid()) - - def test_blank_md5(self): - "Content checks should succeed if a hash is empty" - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=') - checker.feed('anything'.encode('ascii')) - self.assertTrue(checker.is_valid()) - - def test_get_hash_name_md5(self): - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - self.assertEqual(checker.hash_name, 'md5') - - def test_report(self): - checker = setuptools.package_index.HashChecker.from_url( - 'http://foo/bar#md5=f12895fdffbd45007040d2e44df98478') - rep = checker.report(lambda x: x, 'My message about %s') - self.assertEqual(rep, 'My message about md5') diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_resources.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_resources.py deleted file mode 100644 index 3baa3ab..0000000 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_resources.py +++ /dev/null @@ -1,612 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# NOTE: the shebang and encoding lines are for ScriptHeaderTests do not remove - -import os -import sys -import tempfile -import shutil -from unittest import TestCase - -import pkg_resources -from pkg_resources import (parse_requirements, VersionConflict, parse_version, - Distribution, EntryPoint, Requirement, safe_version, safe_name, - WorkingSet) - -from setuptools.command.easy_install import (get_script_header, is_sh, - nt_quote_arg) -from setuptools.compat import StringIO, iteritems, PY3 -from .py26compat import skipIf - -def safe_repr(obj, short=False): - """ copied from Python2.7""" - try: - result = repr(obj) - except Exception: - result = object.__repr__(obj) - if not short or len(result) < pkg_resources._MAX_LENGTH: - return result - return result[:pkg_resources._MAX_LENGTH] + ' [truncated]...' - -class Metadata(pkg_resources.EmptyProvider): - """Mock object to return metadata as if from an on-disk distribution""" - - def __init__(self,*pairs): - self.metadata = dict(pairs) - - def has_metadata(self,name): - return name in self.metadata - - def get_metadata(self,name): - return self.metadata[name] - - def get_metadata_lines(self,name): - return pkg_resources.yield_lines(self.get_metadata(name)) - -dist_from_fn = pkg_resources.Distribution.from_filename - -class DistroTests(TestCase): - - def testCollection(self): - # empty path should produce no distributions - ad = pkg_resources.Environment([], platform=None, python=None) - self.assertEqual(list(ad), []) - self.assertEqual(ad['FooPkg'],[]) - ad.add(dist_from_fn("FooPkg-1.3_1.egg")) - ad.add(dist_from_fn("FooPkg-1.4-py2.4-win32.egg")) - ad.add(dist_from_fn("FooPkg-1.2-py2.4.egg")) - - # Name is in there now - self.assertTrue(ad['FooPkg']) - # But only 1 package - self.assertEqual(list(ad), ['foopkg']) - - # Distributions sort by version - self.assertEqual( - [dist.version for dist in ad['FooPkg']], ['1.4','1.3-1','1.2'] - ) - # Removing a distribution leaves sequence alone - ad.remove(ad['FooPkg'][1]) - self.assertEqual( - [dist.version for dist in ad['FooPkg']], ['1.4','1.2'] - ) - # And inserting adds them in order - ad.add(dist_from_fn("FooPkg-1.9.egg")) - self.assertEqual( - [dist.version for dist in ad['FooPkg']], ['1.9','1.4','1.2'] - ) - - ws = WorkingSet([]) - foo12 = dist_from_fn("FooPkg-1.2-py2.4.egg") - foo14 = dist_from_fn("FooPkg-1.4-py2.4-win32.egg") - req, = parse_requirements("FooPkg>=1.3") - - # Nominal case: no distros on path, should yield all applicable - self.assertEqual(ad.best_match(req,ws).version, '1.9') - # If a matching distro is already installed, should return only that - ws.add(foo14) - self.assertEqual(ad.best_match(req,ws).version, '1.4') - - # If the first matching distro is unsuitable, it's a version conflict - ws = WorkingSet([]) - ws.add(foo12) - ws.add(foo14) - self.assertRaises(VersionConflict, ad.best_match, req, ws) - - # If more than one match on the path, the first one takes precedence - ws = WorkingSet([]) - ws.add(foo14) - ws.add(foo12) - ws.add(foo14) - self.assertEqual(ad.best_match(req,ws).version, '1.4') - - def checkFooPkg(self,d): - self.assertEqual(d.project_name, "FooPkg") - self.assertEqual(d.key, "foopkg") - self.assertEqual(d.version, "1.3-1") - self.assertEqual(d.py_version, "2.4") - self.assertEqual(d.platform, "win32") - self.assertEqual(d.parsed_version, parse_version("1.3-1")) - - def testDistroBasics(self): - d = Distribution( - "/some/path", - project_name="FooPkg",version="1.3-1",py_version="2.4",platform="win32" - ) - self.checkFooPkg(d) - - d = Distribution("/some/path") - self.assertEqual(d.py_version, sys.version[:3]) - self.assertEqual(d.platform, None) - - def testDistroParse(self): - d = dist_from_fn("FooPkg-1.3_1-py2.4-win32.egg") - self.checkFooPkg(d) - d = dist_from_fn("FooPkg-1.3_1-py2.4-win32.egg-info") - self.checkFooPkg(d) - - def testDistroMetadata(self): - d = Distribution( - "/some/path", project_name="FooPkg", py_version="2.4", platform="win32", - metadata = Metadata( - ('PKG-INFO',"Metadata-Version: 1.0\nVersion: 1.3-1\n") - ) - ) - self.checkFooPkg(d) - - def distRequires(self, txt): - return Distribution("/foo", metadata=Metadata(('depends.txt', txt))) - - def checkRequires(self, dist, txt, extras=()): - self.assertEqual( - list(dist.requires(extras)), - list(parse_requirements(txt)) - ) - - def testDistroDependsSimple(self): - for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0": - self.checkRequires(self.distRequires(v), v) - - def testResolve(self): - ad = pkg_resources.Environment([]) - ws = WorkingSet([]) - # Resolving no requirements -> nothing to install - self.assertEqual(list(ws.resolve([],ad)), []) - # Request something not in the collection -> DistributionNotFound - self.assertRaises( - pkg_resources.DistributionNotFound, ws.resolve, parse_requirements("Foo"), ad - ) - Foo = Distribution.from_filename( - "/foo_dir/Foo-1.2.egg", - metadata=Metadata(('depends.txt', "[bar]\nBaz>=2.0")) - ) - ad.add(Foo) - ad.add(Distribution.from_filename("Foo-0.9.egg")) - - # Request thing(s) that are available -> list to activate - for i in range(3): - targets = list(ws.resolve(parse_requirements("Foo"), ad)) - self.assertEqual(targets, [Foo]) - list(map(ws.add,targets)) - self.assertRaises(VersionConflict, ws.resolve, - parse_requirements("Foo==0.9"), ad) - ws = WorkingSet([]) # reset - - # Request an extra that causes an unresolved dependency for "Baz" - self.assertRaises( - pkg_resources.DistributionNotFound, ws.resolve,parse_requirements("Foo[bar]"), ad - ) - Baz = Distribution.from_filename( - "/foo_dir/Baz-2.1.egg", metadata=Metadata(('depends.txt', "Foo")) - ) - ad.add(Baz) - - # Activation list now includes resolved dependency - self.assertEqual( - list(ws.resolve(parse_requirements("Foo[bar]"), ad)), [Foo,Baz] - ) - # Requests for conflicting versions produce VersionConflict - self.assertRaises(VersionConflict, - ws.resolve, parse_requirements("Foo==1.2\nFoo!=1.2"), ad) - - def testDistroDependsOptions(self): - d = self.distRequires(""" - Twisted>=1.5 - [docgen] - ZConfig>=2.0 - docutils>=0.3 - [fastcgi] - fcgiapp>=0.1""") - self.checkRequires(d,"Twisted>=1.5") - self.checkRequires( - d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3".split(), ["docgen"] - ) - self.checkRequires( - d,"Twisted>=1.5 fcgiapp>=0.1".split(), ["fastcgi"] - ) - self.checkRequires( - d,"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3 fcgiapp>=0.1".split(), - ["docgen","fastcgi"] - ) - self.checkRequires( - d,"Twisted>=1.5 fcgiapp>=0.1 ZConfig>=2.0 docutils>=0.3".split(), - ["fastcgi", "docgen"] - ) - self.assertRaises(pkg_resources.UnknownExtra, d.requires, ["foo"]) - - -class EntryPointTests(TestCase): - - def assertfields(self, ep): - self.assertEqual(ep.name,"foo") - self.assertEqual(ep.module_name,"setuptools.tests.test_resources") - self.assertEqual(ep.attrs, ("EntryPointTests",)) - self.assertEqual(ep.extras, ("x",)) - self.assertTrue(ep.load() is EntryPointTests) - self.assertEqual( - str(ep), - "foo = setuptools.tests.test_resources:EntryPointTests [x]" - ) - - def setUp(self): - self.dist = Distribution.from_filename( - "FooPkg-1.2-py2.4.egg", metadata=Metadata(('requires.txt','[x]'))) - - def testBasics(self): - ep = EntryPoint( - "foo", "setuptools.tests.test_resources", ["EntryPointTests"], - ["x"], self.dist - ) - self.assertfields(ep) - - def testParse(self): - s = "foo = setuptools.tests.test_resources:EntryPointTests [x]" - ep = EntryPoint.parse(s, self.dist) - self.assertfields(ep) - - ep = EntryPoint.parse("bar baz= spammity[PING]") - self.assertEqual(ep.name,"bar baz") - self.assertEqual(ep.module_name,"spammity") - self.assertEqual(ep.attrs, ()) - self.assertEqual(ep.extras, ("ping",)) - - ep = EntryPoint.parse(" fizzly = wocka:foo") - self.assertEqual(ep.name,"fizzly") - self.assertEqual(ep.module_name,"wocka") - self.assertEqual(ep.attrs, ("foo",)) - self.assertEqual(ep.extras, ()) - - def testRejects(self): - for ep in [ - "foo", "x=1=2", "x=a:b:c", "q=x/na", "fez=pish:tush-z", "x=f[a]>2", - ]: - try: EntryPoint.parse(ep) - except ValueError: pass - else: raise AssertionError("Should've been bad", ep) - - def checkSubMap(self, m): - self.assertEqual(len(m), len(self.submap_expect)) - for key, ep in iteritems(self.submap_expect): - self.assertEqual(repr(m.get(key)), repr(ep)) - - submap_expect = dict( - feature1=EntryPoint('feature1', 'somemodule', ['somefunction']), - feature2=EntryPoint('feature2', 'another.module', ['SomeClass'], ['extra1','extra2']), - feature3=EntryPoint('feature3', 'this.module', extras=['something']) - ) - submap_str = """ - # define features for blah blah - feature1 = somemodule:somefunction - feature2 = another.module:SomeClass [extra1,extra2] - feature3 = this.module [something] - """ - - def testParseList(self): - self.checkSubMap(EntryPoint.parse_group("xyz", self.submap_str)) - self.assertRaises(ValueError, EntryPoint.parse_group, "x a", "foo=bar") - self.assertRaises(ValueError, EntryPoint.parse_group, "x", - ["foo=baz", "foo=bar"]) - - def testParseMap(self): - m = EntryPoint.parse_map({'xyz':self.submap_str}) - self.checkSubMap(m['xyz']) - self.assertEqual(list(m.keys()),['xyz']) - m = EntryPoint.parse_map("[xyz]\n"+self.submap_str) - self.checkSubMap(m['xyz']) - self.assertEqual(list(m.keys()),['xyz']) - self.assertRaises(ValueError, EntryPoint.parse_map, ["[xyz]", "[xyz]"]) - self.assertRaises(ValueError, EntryPoint.parse_map, self.submap_str) - -class RequirementsTests(TestCase): - - def testBasics(self): - r = Requirement.parse("Twisted>=1.2") - self.assertEqual(str(r),"Twisted>=1.2") - self.assertEqual(repr(r),"Requirement.parse('Twisted>=1.2')") - self.assertEqual(r, Requirement("Twisted", [('>=','1.2')], ())) - self.assertEqual(r, Requirement("twisTed", [('>=','1.2')], ())) - self.assertNotEqual(r, Requirement("Twisted", [('>=','2.0')], ())) - self.assertNotEqual(r, Requirement("Zope", [('>=','1.2')], ())) - self.assertNotEqual(r, Requirement("Zope", [('>=','3.0')], ())) - self.assertNotEqual(r, Requirement.parse("Twisted[extras]>=1.2")) - - def testOrdering(self): - r1 = Requirement("Twisted", [('==','1.2c1'),('>=','1.2')], ()) - r2 = Requirement("Twisted", [('>=','1.2'),('==','1.2c1')], ()) - self.assertEqual(r1,r2) - self.assertEqual(str(r1),str(r2)) - self.assertEqual(str(r2),"Twisted==1.2c1,>=1.2") - - def testBasicContains(self): - r = Requirement("Twisted", [('>=','1.2')], ()) - foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg") - twist11 = Distribution.from_filename("Twisted-1.1.egg") - twist12 = Distribution.from_filename("Twisted-1.2.egg") - self.assertTrue(parse_version('1.2') in r) - self.assertTrue(parse_version('1.1') not in r) - self.assertTrue('1.2' in r) - self.assertTrue('1.1' not in r) - self.assertTrue(foo_dist not in r) - self.assertTrue(twist11 not in r) - self.assertTrue(twist12 in r) - - def testAdvancedContains(self): - r, = parse_requirements("Foo>=1.2,<=1.3,==1.9,>2.0,!=2.5,<3.0,==4.5") - for v in ('1.2','1.2.2','1.3','1.9','2.0.1','2.3','2.6','3.0c1','4.5'): - self.assertTrue(v in r, (v,r)) - for v in ('1.2c1','1.3.1','1.5','1.9.1','2.0','2.5','3.0','4.0'): - self.assertTrue(v not in r, (v,r)) - - def testOptionsAndHashing(self): - r1 = Requirement.parse("Twisted[foo,bar]>=1.2") - r2 = Requirement.parse("Twisted[bar,FOO]>=1.2") - r3 = Requirement.parse("Twisted[BAR,FOO]>=1.2.0") - self.assertEqual(r1,r2) - self.assertEqual(r1,r3) - self.assertEqual(r1.extras, ("foo","bar")) - self.assertEqual(r2.extras, ("bar","foo")) # extras are normalized - self.assertEqual(hash(r1), hash(r2)) - self.assertEqual( - hash(r1), hash(("twisted", ((">=",parse_version("1.2")),), - frozenset(["foo","bar"]))) - ) - - def testVersionEquality(self): - r1 = Requirement.parse("foo==0.3a2") - r2 = Requirement.parse("foo!=0.3a4") - d = Distribution.from_filename - - self.assertTrue(d("foo-0.3a4.egg") not in r1) - self.assertTrue(d("foo-0.3a1.egg") not in r1) - self.assertTrue(d("foo-0.3a4.egg") not in r2) - - self.assertTrue(d("foo-0.3a2.egg") in r1) - self.assertTrue(d("foo-0.3a2.egg") in r2) - self.assertTrue(d("foo-0.3a3.egg") in r2) - self.assertTrue(d("foo-0.3a5.egg") in r2) - - def testSetuptoolsProjectName(self): - """ - The setuptools project should implement the setuptools package. - """ - - self.assertEqual( - Requirement.parse('setuptools').project_name, 'setuptools') - # setuptools 0.7 and higher means setuptools. - self.assertEqual( - Requirement.parse('setuptools == 0.7').project_name, 'setuptools') - self.assertEqual( - Requirement.parse('setuptools == 0.7a1').project_name, 'setuptools') - self.assertEqual( - Requirement.parse('setuptools >= 0.7').project_name, 'setuptools') - - -class ParseTests(TestCase): - - def testEmptyParse(self): - self.assertEqual(list(parse_requirements('')), []) - - def testYielding(self): - for inp,out in [ - ([], []), ('x',['x']), ([[]],[]), (' x\n y', ['x','y']), - (['x\n\n','y'], ['x','y']), - ]: - self.assertEqual(list(pkg_resources.yield_lines(inp)),out) - - def testSplitting(self): - sample = """ - x - [Y] - z - - a - [b ] - # foo - c - [ d] - [q] - v - """ - self.assertEqual(list(pkg_resources.split_sections(sample)), - [(None,["x"]), ("Y",["z","a"]), ("b",["c"]), ("d",[]), ("q",["v"])] - ) - self.assertRaises(ValueError,list,pkg_resources.split_sections("[foo")) - - def testSafeName(self): - self.assertEqual(safe_name("adns-python"), "adns-python") - self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils") - self.assertEqual(safe_name("WSGI Utils"), "WSGI-Utils") - self.assertEqual(safe_name("Money$$$Maker"), "Money-Maker") - self.assertNotEqual(safe_name("peak.web"), "peak-web") - - def testSafeVersion(self): - self.assertEqual(safe_version("1.2-1"), "1.2-1") - self.assertEqual(safe_version("1.2 alpha"), "1.2.alpha") - self.assertEqual(safe_version("2.3.4 20050521"), "2.3.4.20050521") - self.assertEqual(safe_version("Money$$$Maker"), "Money-Maker") - self.assertEqual(safe_version("peak.web"), "peak.web") - - def testSimpleRequirements(self): - self.assertEqual( - list(parse_requirements('Twis-Ted>=1.2-1')), - [Requirement('Twis-Ted',[('>=','1.2-1')], ())] - ) - self.assertEqual( - list(parse_requirements('Twisted >=1.2, \ # more\n<2.0')), - [Requirement('Twisted',[('>=','1.2'),('<','2.0')], ())] - ) - self.assertEqual( - Requirement.parse("FooBar==1.99a3"), - Requirement("FooBar", [('==','1.99a3')], ()) - ) - self.assertRaises(ValueError,Requirement.parse,">=2.3") - self.assertRaises(ValueError,Requirement.parse,"x\\") - self.assertRaises(ValueError,Requirement.parse,"x==2 q") - self.assertRaises(ValueError,Requirement.parse,"X==1\nY==2") - self.assertRaises(ValueError,Requirement.parse,"#") - - def testVersionEquality(self): - def c(s1,s2): - p1, p2 = parse_version(s1),parse_version(s2) - self.assertEqual(p1,p2, (s1,s2,p1,p2)) - - c('1.2-rc1', '1.2rc1') - c('0.4', '0.4.0') - c('0.4.0.0', '0.4.0') - c('0.4.0-0', '0.4-0') - c('0pl1', '0.0pl1') - c('0pre1', '0.0c1') - c('0.0.0preview1', '0c1') - c('0.0c1', '0-rc1') - c('1.2a1', '1.2.a.1') - c('1.2...a', '1.2a') - - def testVersionOrdering(self): - def c(s1,s2): - p1, p2 = parse_version(s1),parse_version(s2) - self.assertTrue(p1 dummy-0\.1\.1", - "copying dummy", - "copying dummy\.egg-info", - "hard linking \S+ -> dummy-0\.1\.1", - "hard linking dummy", - "hard linking dummy\.egg-info", - "Writing dummy-0\.1\.1", - "creating dist", - "creating 'dist", - "Creating tar archive", - "running check", - "adding 'dummy-0\.1\.1", - "tar .+ dist/dummy-0\.1\.1\.tar dummy-0\.1\.1", - "gzip .+ dist/dummy-0\.1\.1\.tar", - "removing 'dummy-0\.1\.1' \\(and everything under it\\)", - ) - - print(" DIR: " + os.path.abspath('.')) - for line in datalines: - found = False - for pattern in possible: - if re.match(pattern, line): - print(" READ: " + line) - found = True - break - if not found: - raise AssertionError("Unexpexected: %s\n-in-\n%s" - % (line, data)) - - return data - - def test_sources(self): - self._run() - - -class TestSvn(environment.ZippedEnvironment): - - def setUp(self): - version = svn_utils.SvnInfo.get_svn_version() - if not version: # None or Empty - return - - self.base_version = tuple([int(x) for x in version.split('.')][:2]) - - if not self.base_version: - raise ValueError('No SVN tools installed') - elif self.base_version < (1, 3): - raise ValueError('Insufficient SVN Version %s' % version) - elif self.base_version >= (1, 9): - # trying the latest version - self.base_version = (1, 8) - - self.dataname = "svn%i%i_example" % self.base_version - self.datafile = os.path.join('setuptools', 'tests', - 'svn_data', self.dataname + ".zip") - super(TestSvn, self).setUp() - - @skipIf(not test_svn._svn_check, "No SVN to text, in the first place") - def test_walksvn(self): - if self.base_version >= (1, 6): - folder2 = 'third party2' - folder3 = 'third party3' - else: - folder2 = 'third_party2' - folder3 = 'third_party3' - - # TODO is this right - expected = set([ - os.path.join('a file'), - os.path.join(folder2, 'Changes.txt'), - os.path.join(folder2, 'MD5SUMS'), - os.path.join(folder2, 'README.txt'), - os.path.join(folder3, 'Changes.txt'), - os.path.join(folder3, 'MD5SUMS'), - os.path.join(folder3, 'README.txt'), - os.path.join(folder3, 'TODO.txt'), - os.path.join(folder3, 'fin'), - os.path.join('third_party', 'README.txt'), - os.path.join('folder', folder2, 'Changes.txt'), - os.path.join('folder', folder2, 'MD5SUMS'), - os.path.join('folder', folder2, 'WatashiNiYomimasu.txt'), - os.path.join('folder', folder3, 'Changes.txt'), - os.path.join('folder', folder3, 'fin'), - os.path.join('folder', folder3, 'MD5SUMS'), - os.path.join('folder', folder3, 'oops'), - os.path.join('folder', folder3, 'WatashiNiYomimasu.txt'), - os.path.join('folder', folder3, 'ZuMachen.txt'), - os.path.join('folder', 'third_party', 'WatashiNiYomimasu.txt'), - os.path.join('folder', 'lalala.txt'), - os.path.join('folder', 'quest.txt'), - # The example will have a deleted file - # (or should) but shouldn't return it - ]) - self.assertEqual(set(x for x in walk_revctrl()), expected) - - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_svn.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_svn.py deleted file mode 100644 index 3340036..0000000 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_svn.py +++ /dev/null @@ -1,245 +0,0 @@ -# -*- coding: utf-8 -*- -"""svn tests""" - -import io -import os -import subprocess -import sys -import unittest -from setuptools.tests import environment -from setuptools.compat import unicode, unichr - -from setuptools import svn_utils -from setuptools.tests.py26compat import skipIf - - -def _do_svn_check(): - try: - subprocess.check_call(["svn", "--version"], - shell=(sys.platform == 'win32')) - return True - except (OSError, subprocess.CalledProcessError): - return False -_svn_check = _do_svn_check() - - -class TestSvnVersion(unittest.TestCase): - - def test_no_svn_found(self): - path_variable = None - for env in os.environ: - if env.lower() == 'path': - path_variable = env - - if path_variable is None: - try: - self.skipTest('Cannot figure out how to modify path') - except AttributeError: # PY26 doesn't have this - return - - old_path = os.environ[path_variable] - os.environ[path_variable] = '' - try: - version = svn_utils.SvnInfo.get_svn_version() - self.assertEqual(version, '') - finally: - os.environ[path_variable] = old_path - - @skipIf(not _svn_check, "No SVN to text, in the first place") - def test_svn_should_exist(self): - version = svn_utils.SvnInfo.get_svn_version() - self.assertNotEqual(version, '') - -def _read_utf8_file(path): - fileobj = None - try: - fileobj = io.open(path, 'r', encoding='utf-8') - data = fileobj.read() - return data - finally: - if fileobj: - fileobj.close() - - -class ParserInfoXML(unittest.TestCase): - - def parse_tester(self, svn_name, ext_spaces): - path = os.path.join('setuptools', 'tests', - 'svn_data', svn_name + '_info.xml') - #Remember these are pre-generated to test XML parsing - # so these paths might not valid on your system - example_base = "%s_example" % svn_name - - data = _read_utf8_file(path) - - expected = set([ - ("\\".join((example_base, 'a file')), 'file'), - ("\\".join((example_base, 'folder')), 'dir'), - ("\\".join((example_base, 'folder', 'lalala.txt')), 'file'), - ("\\".join((example_base, 'folder', 'quest.txt')), 'file'), - ]) - self.assertEqual(set(x for x in svn_utils.parse_dir_entries(data)), - expected) - - def test_svn13(self): - self.parse_tester('svn13', False) - - def test_svn14(self): - self.parse_tester('svn14', False) - - def test_svn15(self): - self.parse_tester('svn15', False) - - def test_svn16(self): - self.parse_tester('svn16', True) - - def test_svn17(self): - self.parse_tester('svn17', True) - - def test_svn18(self): - self.parse_tester('svn18', True) - -class ParserExternalXML(unittest.TestCase): - - def parse_tester(self, svn_name, ext_spaces): - path = os.path.join('setuptools', 'tests', - 'svn_data', svn_name + '_ext_list.xml') - example_base = svn_name + '_example' - data = _read_utf8_file(path) - - if ext_spaces: - folder2 = 'third party2' - folder3 = 'third party3' - else: - folder2 = 'third_party2' - folder3 = 'third_party3' - - expected = set([ - os.sep.join((example_base, folder2)), - os.sep.join((example_base, folder3)), - # folder is third_party大介 - os.sep.join((example_base, - unicode('third_party') + - unichr(0x5927) + unichr(0x4ecb))), - os.sep.join((example_base, 'folder', folder2)), - os.sep.join((example_base, 'folder', folder3)), - os.sep.join((example_base, 'folder', - unicode('third_party') + - unichr(0x5927) + unichr(0x4ecb))), - ]) - - expected = set(os.path.normpath(x) for x in expected) - dir_base = os.sep.join(('C:', 'development', 'svn_example')) - self.assertEqual(set(x for x - in svn_utils.parse_externals_xml(data, dir_base)), expected) - - def test_svn15(self): - self.parse_tester('svn15', False) - - def test_svn16(self): - self.parse_tester('svn16', True) - - def test_svn17(self): - self.parse_tester('svn17', True) - - def test_svn18(self): - self.parse_tester('svn18', True) - - -class ParseExternal(unittest.TestCase): - - def parse_tester(self, svn_name, ext_spaces): - path = os.path.join('setuptools', 'tests', - 'svn_data', svn_name + '_ext_list.txt') - data = _read_utf8_file(path) - - if ext_spaces: - expected = set(['third party2', 'third party3', - 'third party3b', 'third_party']) - else: - expected = set(['third_party2', 'third_party3', 'third_party']) - - self.assertEqual(set(x for x in svn_utils.parse_external_prop(data)), - expected) - - def test_svn13(self): - self.parse_tester('svn13', False) - - def test_svn14(self): - self.parse_tester('svn14', False) - - def test_svn15(self): - self.parse_tester('svn15', False) - - def test_svn16(self): - self.parse_tester('svn16', True) - - def test_svn17(self): - self.parse_tester('svn17', True) - - def test_svn18(self): - self.parse_tester('svn18', True) - - -class TestSvn(environment.ZippedEnvironment): - - def setUp(self): - version = svn_utils.SvnInfo.get_svn_version() - if not version: # empty or null - self.dataname = None - self.datafile = None - return - - self.base_version = tuple([int(x) for x in version.split('.')[:2]]) - - if self.base_version < (1,3): - raise ValueError('Insufficient SVN Version %s' % version) - elif self.base_version >= (1,9): - #trying the latest version - self.base_version = (1,8) - - self.dataname = "svn%i%i_example" % self.base_version - self.datafile = os.path.join('setuptools', 'tests', - 'svn_data', self.dataname + ".zip") - super(TestSvn, self).setUp() - - @skipIf(not _svn_check, "No SVN to text, in the first place") - def test_revision(self): - rev = svn_utils.SvnInfo.load('.').get_revision() - self.assertEqual(rev, 6) - - @skipIf(not _svn_check, "No SVN to text, in the first place") - def test_entries(self): - expected = set([ - (os.path.join('a file'), 'file'), - (os.path.join('folder'), 'dir'), - (os.path.join('folder', 'lalala.txt'), 'file'), - (os.path.join('folder', 'quest.txt'), 'file'), - #The example will have a deleted file (or should) - #but shouldn't return it - ]) - info = svn_utils.SvnInfo.load('.') - self.assertEqual(set(x for x in info.entries), expected) - - @skipIf(not _svn_check, "No SVN to text, in the first place") - def test_externals(self): - if self.base_version >= (1,6): - folder2 = 'third party2' - folder3 = 'third party3' - else: - folder2 = 'third_party2' - folder3 = 'third_party3' - - expected = set([ - os.path.join(folder2), - os.path.join(folder3), - os.path.join('third_party'), - os.path.join('folder', folder2), - os.path.join('folder', folder3), - os.path.join('folder', 'third_party'), - ]) - info = svn_utils.SvnInfo.load('.') - self.assertEqual(set([x for x in info.externals]), expected) - -def test_suite(): - return unittest.defaultTestLoader.loadTestsFromName(__name__) diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_test.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_test.py deleted file mode 100644 index df92085..0000000 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_test.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- coding: UTF-8 -*- - -"""develop tests -""" -import os -import shutil -import site -import sys -import tempfile -import unittest - -from distutils.errors import DistutilsError -from setuptools.compat import StringIO, PY2 -from setuptools.command.test import test -from setuptools.command import easy_install as easy_install_pkg -from setuptools.dist import Distribution - -SETUP_PY = """\ -from setuptools import setup - -setup(name='foo', - packages=['name', 'name.space', 'name.space.tests'], - namespace_packages=['name'], - test_suite='name.space.tests.test_suite', -) -""" - -NS_INIT = """# -*- coding: Latin-1 -*- -# Söme Arbiträry Ünicode to test Issüé 310 -try: - __import__('pkg_resources').declare_namespace(__name__) -except ImportError: - from pkgutil import extend_path - __path__ = extend_path(__path__, __name__) -""" -# Make sure this is Latin-1 binary, before writing: -if PY2: - NS_INIT = NS_INIT.decode('UTF-8') -NS_INIT = NS_INIT.encode('Latin-1') - -TEST_PY = """import unittest - -class TestTest(unittest.TestCase): - def test_test(self): - print "Foo" # Should fail under Python 3 unless 2to3 is used - -test_suite = unittest.makeSuite(TestTest) -""" - -class TestTestTest(unittest.TestCase): - - def setUp(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): - return - - # Directory structure - self.dir = tempfile.mkdtemp() - os.mkdir(os.path.join(self.dir, 'name')) - os.mkdir(os.path.join(self.dir, 'name', 'space')) - os.mkdir(os.path.join(self.dir, 'name', 'space', 'tests')) - # setup.py - setup = os.path.join(self.dir, 'setup.py') - f = open(setup, 'wt') - f.write(SETUP_PY) - f.close() - self.old_cwd = os.getcwd() - # name/__init__.py - init = os.path.join(self.dir, 'name', '__init__.py') - f = open(init, 'wb') - f.write(NS_INIT) - f.close() - # name/space/__init__.py - init = os.path.join(self.dir, 'name', 'space', '__init__.py') - f = open(init, 'wt') - f.write('#empty\n') - f.close() - # name/space/tests/__init__.py - init = os.path.join(self.dir, 'name', 'space', 'tests', '__init__.py') - f = open(init, 'wt') - f.write(TEST_PY) - f.close() - - os.chdir(self.dir) - self.old_base = site.USER_BASE - site.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = tempfile.mkdtemp() - - def tearDown(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): - return - - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - - def test_test(self): - if sys.version < "2.6" or hasattr(sys, 'real_prefix'): - return - - dist = Distribution(dict( - name='foo', - packages=['name', 'name.space', 'name.space.tests'], - namespace_packages=['name'], - test_suite='name.space.tests.test_suite', - use_2to3=True, - )) - dist.script_name = 'setup.py' - cmd = test(dist) - cmd.user = 1 - cmd.ensure_finalized() - cmd.install_dir = site.USER_SITE - cmd.user = 1 - old_stdout = sys.stdout - sys.stdout = StringIO() - try: - try: # try/except/finally doesn't work in Python 2.4, so we need nested try-statements. - cmd.run() - except SystemExit: # The test runner calls sys.exit, stop that making an error. - pass - finally: - sys.stdout = old_stdout - diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_upload_docs.py b/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_upload_docs.py deleted file mode 100644 index 769f16c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/tests/test_upload_docs.py +++ /dev/null @@ -1,72 +0,0 @@ -"""build_ext tests -""" -import sys, os, shutil, tempfile, unittest, site, zipfile -from setuptools.command.upload_docs import upload_docs -from setuptools.dist import Distribution - -SETUP_PY = """\ -from setuptools import setup - -setup(name='foo') -""" - -class TestUploadDocsTest(unittest.TestCase): - def setUp(self): - self.dir = tempfile.mkdtemp() - setup = os.path.join(self.dir, 'setup.py') - f = open(setup, 'w') - f.write(SETUP_PY) - f.close() - self.old_cwd = os.getcwd() - os.chdir(self.dir) - - self.upload_dir = os.path.join(self.dir, 'build') - os.mkdir(self.upload_dir) - - # A test document. - f = open(os.path.join(self.upload_dir, 'index.html'), 'w') - f.write("Hello world.") - f.close() - - # An empty folder. - os.mkdir(os.path.join(self.upload_dir, 'empty')) - - if sys.version >= "2.6": - self.old_base = site.USER_BASE - site.USER_BASE = upload_docs.USER_BASE = tempfile.mkdtemp() - self.old_site = site.USER_SITE - site.USER_SITE = upload_docs.USER_SITE = tempfile.mkdtemp() - - def tearDown(self): - os.chdir(self.old_cwd) - shutil.rmtree(self.dir) - if sys.version >= "2.6": - shutil.rmtree(site.USER_BASE) - shutil.rmtree(site.USER_SITE) - site.USER_BASE = self.old_base - site.USER_SITE = self.old_site - - def test_create_zipfile(self): - # Test to make sure zipfile creation handles common cases. - # This explicitly includes a folder containing an empty folder. - - dist = Distribution() - - cmd = upload_docs(dist) - cmd.upload_dir = self.upload_dir - cmd.target_dir = self.upload_dir - tmp_dir = tempfile.mkdtemp() - tmp_file = os.path.join(tmp_dir, 'foo.zip') - try: - zip_file = cmd.create_zipfile(tmp_file) - - assert zipfile.is_zipfile(tmp_file) - - zip_file = zipfile.ZipFile(tmp_file) # woh... - - assert zip_file.namelist() == ['index.html'] - - zip_file.close() - finally: - shutil.rmtree(tmp_dir) - diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/version.py b/Linux_i686/lib/python3.4/site-packages/setuptools/version.py index c974945..9f17b0a 100644 --- a/Linux_i686/lib/python3.4/site-packages/setuptools/version.py +++ b/Linux_i686/lib/python3.4/site-packages/setuptools/version.py @@ -1 +1 @@ -__version__ = '6.0.2' +__version__ = '18.6.1' diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools/windows_support.py b/Linux_i686/lib/python3.4/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000..cb977cf --- /dev/null +++ b/Linux_i686/lib/python3.4/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/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/DESCRIPTION.rst b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/DESCRIPTION.rst similarity index 63% rename from Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/DESCRIPTION.rst rename to Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/DESCRIPTION.rst index 70f0b0f..2e2607d 100644 --- a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/DESCRIPTION.rst +++ b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/DESCRIPTION.rst @@ -3,16 +3,16 @@ for smoothing over the differences between the Python versions with the goal of writing Python code that is compatible on both Python versions. See the documentation for more information on what is provided. -Six supports every Python version since 2.5. It is contained in only one Python +Six supports every Python version since 2.6. It is contained in only one Python file, so it can be easily copied into your project. (The copyright and license notice must be retained.) -Online documentation is at http://pythonhosted.org/six/. +Online documentation is at https://pythonhosted.org/six/. -Bugs can be reported to http://bitbucket.org/gutworth/six. The code can also be -found there. +Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also +be found there. For questions about six or porting in general, email the python-porting mailing -list: http://mail.python.org/mailman/listinfo/python-porting +list: https://mail.python.org/mailman/listinfo/python-porting diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/METADATA b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/METADATA similarity index 77% rename from Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/METADATA rename to Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/METADATA index dbcf6f7..4fc3d07 100644 --- a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/METADATA +++ b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.0 Name: six -Version: 1.8.0 +Version: 1.10.0 Summary: Python 2 and 3 compatibility utilities Home-page: http://pypi.python.org/pypi/six/ Author: Benjamin Peterson @@ -19,16 +19,16 @@ for smoothing over the differences between the Python versions with the goal of writing Python code that is compatible on both Python versions. See the documentation for more information on what is provided. -Six supports every Python version since 2.5. It is contained in only one Python +Six supports every Python version since 2.6. It is contained in only one Python file, so it can be easily copied into your project. (The copyright and license notice must be retained.) -Online documentation is at http://pythonhosted.org/six/. +Online documentation is at https://pythonhosted.org/six/. -Bugs can be reported to http://bitbucket.org/gutworth/six. The code can also be -found there. +Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also +be found there. For questions about six or porting in general, email the python-porting mailing -list: http://mail.python.org/mailman/listinfo/python-porting +list: https://mail.python.org/mailman/listinfo/python-porting diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD new file mode 100644 index 0000000..6350c4e --- /dev/null +++ b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/RECORD @@ -0,0 +1,8 @@ +six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +six-1.10.0.dist-info/DESCRIPTION.rst,sha256=QWBtSTT2zzabwJv1NQbTfClSX13m-Qc6tqU4TRL1RLs,774 +six-1.10.0.dist-info/METADATA,sha256=5HceJsUnHof2IRamlCKO2MwNjve1eSP4rLzVQDfwpCQ,1283 +six-1.10.0.dist-info/RECORD,, +six-1.10.0.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 +six-1.10.0.dist-info/metadata.json,sha256=jtOeeTBubYDChl_5Ql5ZPlKoHgg6rdqRIjOz1e5Ek2U,658 +six-1.10.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 +__pycache__/six.cpython-34.pyc,, diff --git a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/WHEEL b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/WHEEL similarity index 67% rename from Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/WHEEL rename to Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/WHEEL index cabc9c4..0de529b 100644 --- a/Linux_i686/lib/python3.4/site-packages/setuptools-6.0.2.dist-info/WHEEL +++ b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/WHEEL @@ -1,6 +1,6 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.24.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - +Wheel-Version: 1.0 +Generator: bdist_wheel (0.26.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json new file mode 100644 index 0000000..21f9f6c --- /dev/null +++ b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"generator": "bdist_wheel (0.26.0)", "summary": "Python 2 and 3 compatibility utilities", "classifiers": ["Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Libraries", "Topic :: Utilities"], "extensions": {"python.details": {"project_urls": {"Home": "http://pypi.python.org/pypi/six/"}, "contacts": [{"email": "benjamin@python.org", "name": "Benjamin Peterson", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}}}, "license": "MIT", "metadata_version": "2.0", "name": "six", "version": "1.10.0"} \ No newline at end of file diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/top_level.txt b/Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/top_level.txt similarity index 100% rename from Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/top_level.txt rename to Linux_i686/lib/python3.4/site-packages/six-1.10.0.dist-info/top_level.txt diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/RECORD b/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/RECORD deleted file mode 100644 index 7b3b67c..0000000 --- a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/RECORD +++ /dev/null @@ -1,8 +0,0 @@ -six.py,sha256=6N-6RCENPfBtMpN5UmgDfDKmJebbbuPu_Dk3Zf8ngww,27344 -six-1.8.0.dist-info/METADATA,sha256=YdVJG54t6rwaLnVT7g9dy16nVwaDcBN5U_N3m5Vt6S0,1279 -six-1.8.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 -six-1.8.0.dist-info/DESCRIPTION.rst,sha256=wDIPS0rnIMXICM3qxqUg2g5ozzQyOpCLh8oaca9UgFQ,771 -six-1.8.0.dist-info/metadata.json,sha256=uTTPmv2luMnDfW-4DxQZPcjyeEnCFUfacrqXhA1zJTg,657 -six-1.8.0.dist-info/RECORD,, -six-1.8.0.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 -__pycache__/six.cpython-34.pyc,, diff --git a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/metadata.json b/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/metadata.json deleted file mode 100644 index 016c71a..0000000 --- a/Linux_i686/lib/python3.4/site-packages/six-1.8.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"license": "MIT", "name": "six", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "Python 2 and 3 compatibility utilities", "version": "1.8.0", "extensions": {"python.details": {"project_urls": {"Home": "http://pypi.python.org/pypi/six/"}, "document_names": {"description": "DESCRIPTION.rst"}, "contacts": [{"role": "author", "email": "benjamin@python.org", "name": "Benjamin Peterson"}]}}, "classifiers": ["Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Libraries", "Topic :: Utilities"]} \ No newline at end of file diff --git a/Linux_i686/lib/python3.4/site-packages/six.py b/Linux_i686/lib/python3.4/site-packages/six.py index 21b0e80..190c023 100644 --- a/Linux_i686/lib/python3.4/site-packages/six.py +++ b/Linux_i686/lib/python3.4/site-packages/six.py @@ -1,6 +1,6 @@ """Utilities for writing code that runs on Python 2 and 3""" -# Copyright (c) 2010-2014 Benjamin Peterson +# 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 @@ -23,17 +23,19 @@ from __future__ import absolute_import import functools +import itertools import operator import sys import types __author__ = "Benjamin Peterson " -__version__ = "1.8.0" +__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, @@ -56,6 +58,7 @@ else: else: # It's possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): + def __len__(self): return 1 << 31 try: @@ -87,9 +90,13 @@ class _LazyDescr(object): def __get__(self, obj, tp): result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - # This is a bit ugly, but it avoids running this again. - delattr(obj.__class__, self.name) + 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 @@ -155,12 +162,14 @@ class MovedAttribute(_LazyDescr): 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 = {} @@ -218,6 +227,7 @@ _importer = _SixMetaPathImporter(__name__) class _MovedItems(_LazyModule): + """Lazy loading of moved objects""" __path__ = [] # mark as package @@ -229,8 +239,10 @@ _moved_attributes = [ 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__", "imp", "reload"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), @@ -240,7 +252,6 @@ _moved_attributes = [ 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"), @@ -287,8 +298,13 @@ _moved_attributes = [ MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), - MovedModule("winreg", "_winreg"), ] +# 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): @@ -302,6 +318,7 @@ _importer._add_module(moves, "moves") class Module_six_moves_urllib_parse(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_parse""" @@ -341,6 +358,7 @@ _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_pa class Module_six_moves_urllib_error(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_error""" @@ -360,6 +378,7 @@ _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.er class Module_six_moves_urllib_request(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_request""" @@ -409,6 +428,7 @@ _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib. class Module_six_moves_urllib_response(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_response""" @@ -429,6 +449,7 @@ _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib class Module_six_moves_urllib_robotparser(_LazyModule): + """Lazy loading of moved objects in six.moves.urllib_robotparser""" @@ -446,6 +467,7 @@ _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.url 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") @@ -516,6 +538,9 @@ if PY3: create_bound_method = types.MethodType + def create_unbound_method(func, cls): + return func + Iterator = object else: def get_unbound_function(unbound): @@ -524,6 +549,9 @@ else: 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): @@ -554,18 +582,30 @@ if PY3: 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 iter(d.iterkeys(**kw)) + return d.iterkeys(**kw) def itervalues(d, **kw): - return iter(d.itervalues(**kw)) + return d.itervalues(**kw) def iteritems(d, **kw): - return iter(d.iteritems(**kw)) + return d.iteritems(**kw) def iterlists(d, **kw): - return iter(d.iterlists(**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.") @@ -578,45 +618,66 @@ _add_doc(iterlists, if PY3: def b(s): return s.encode("latin-1") + def u(s): return s unichr = chr - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") + 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]) - def iterbytes(buf): - return (ord(byte) for byte in buf) + 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() @@ -637,12 +698,26 @@ else: _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): @@ -650,13 +725,14 @@ if print_ is None: 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): + isinstance(data, unicode) and + fp.encoding is not None): errors = getattr(fp, "errors", None) if errors is None: errors = "strict" @@ -697,6 +773,15 @@ if print_ is None: 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.""") @@ -704,19 +789,21 @@ 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)(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', (), {}) @@ -737,6 +824,25 @@ def add_metaclass(metaclass): 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. @@ -754,7 +860,7 @@ if sys.meta_path: # 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__): + importer.name == __name__): del sys.meta_path[i] break del i, importer diff --git a/Linux_i686/lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/sqlalchemy/cprocessors.cpython-34m.so index 9cca634562726af91c587a0698a048b8fb9ff417..1381489678399ddbfc97a1028975b71e806dac97 100755 GIT binary patch literal 35281 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 N#?^0>^m(fKe*m~|w6y>L literal 34544 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 ph`=3?G260p^~YgTG@!9aSct$XxhX8Fvw z4*k!{rFlQ@{W$a4_iwoxNeR~tRKi@;_rDzkka(U84b$T{H;m(KTqPHM8lbj<@=KO14;OiBz(S;8E_=RB}wUzC*kKOl{Y9UeMOS~ z{v`gPNw|w$1yKGkT?E$Wr6l=30nNFXet8oA14;Z#lFBPdO1G2pS0~~3C*jX0;a!e0 zfYj%zr1YMo@(v~Of1bqu*Cf0tN&i|`{s7{?Pm=%Jr2Om)&J{r9yd?hpP9h-nza=Su zKFaU-hEmrdZLmsL!vH@8&TFvBP`4xfgK~{$BXwH>ev-&+%FyY9m0#^ZdS8tHB&CAE z#@6<>U^r6S83_heu(_={qJj+oDpSo8ER|}M?#$o=T@||w}lqgE^i6xwBx4) z>(2~Zq_erL(a2fU)=^ux!V$C}w6ZJI zRu>9ZG==I`fMpJp4=!BW!BQ%lQHF_AI-`#0>eh~Sm_UQM?e$%5y=H|XGa`}BSh+^s z>Tq=%EQjJC+*Jh~1ua95LM%&@x6fcYI!GwVSP~HXH%&5?s~QRu^e* zZvzP?467iDn1@DzVqJCQ6*C0292%>ty|cB}B?J|zMq9G*_O?dH77JRMVKKLnG+%2> zVjP!zGr|OvLhHs8b@4_}th(`ZQzAUwKdnZ*N1{L!ZQ|BR9DBW&5B%DSJ&0q z8KPf^234Kytqa1iV=$q1ZK2NQI*4a$ft8KSX!G)}NUWtP4hf+ST5@h}q^?PPlH`h( zP_2{if)L$J+^!m(B3RcM3U{?cIy&3etc7S+5;d0swY`NhKU7=KWbHx0iq24NBs4Kj zm{DJEyrZRgc}JuP>Geh7_M#F6ypFN6RWMXv8>vOtTpkYVo(WQ0y_z+ry1XJdv1mdO zr{jNnxrUm5%X=aQ3#$b8zaESq9H)4Nhc{yl;8Bl)#*1qp8*rb2+sicmrh)GmxZglE zL#O);%rLOPz)1!!G;pbbO$M$p@FoLqGjN-MPZ-!|;2{GQ#y{$rVPKhol?Ki+u*SfJ z23}_1dIL8YxY@v)47|<2I}O}s;C2Id82E^Ry9|87z~>CyZQzRrzT(iQV;u&YzetD$ z+$)5r(CdU4>-P~3RO(GatZm;R9Hi9m2y?OCB|I7P24Ozt1H!RN9U>g3)M3H`%rk_A zN_|dPtkgdVC%|rKzcdSeKbw5| z`XaCX2RKnTF?xVm`X69VYhv<&eS&kP-bCVo-GZYrRTKXl*d;hu%S{2|+XZK|2`#G* zY!Mudt(u^zIhJVJaQ@iM`w zdeb|^O9a1~_YuUP+^i1WVez<$BE5a$y4z&^om zBc4rsx8QdY&n3PKcu!vbo`x;)e~Y^RyrA!|kbB*pG<4hOp`706U*VR$w|;=X0iGDBZsN zzFt(RZxYCRqvW!*rc|u=IrK&&FHPi)(eiqtZ^Evq#?YSVVJ$Gd_g2!RS|Z`V=}4fF zwk(bw%I%5d2YRY(WJ&L_doSwW_(pejWK~a9Mj~ZlPgQmzWnxcN4k$UXTwVU28XxrT zpP$=Pe;*9RkBx5vil9X%B2t<29uvt$6~0@}S%`wuV;#a8B*(&p!aedF$|4Rkcn za(i!02S@L-e)3(NZ+9<5qe23CTfZc4_uj~r;LMZM(tHsg9b&}xRSQp~B4(w?`P$ki z^<0y&u|JaCGcOy?;_q3U(|vg38(kxMqc^>0REoX=EA)sfOoW(dkrnyIgx%2>1D9SA z+>>a(o!Wld>@~Ru-w_AQqfE+t*btJUOgb>80=#_{G!U=s)<;mfmQkqf7L4khCpEqZIH86Emz*z0oVc zcku1rXd&S*w>bR`4iG(*hbou$?T6Oa?NOM`Hy+K}@N?9qHyWXI=$#`q>V7$E!y`iP zHKle>&F{PO3zSxDb-xs;-uPkGh8`NB1wK%k-}fk!KDWA-MO&2>nT!gRz*`f0Nhzt( zRI9tgW)1VubQo-A`5?LPh6><0&55WF{5U$G z4;BCY!GT-c*CKX+zrtJ?{|e{W~G!Fq5q)^{*b9x zqf61O(5Q-LHI~xj2JPE5pvSS&7PJQj8^?&?ov>Tm)$#uW7s6W_wwPh4Cig%@a5zIQ z>K*9&HHx@y&nH;Q^pr_g?xe~u=3Z(Bs@VAY){^d*VZ#T6e-HShhYF};Ir!0J-Fw+( z`f`wb?%u48D=`uEEX*%M8QB;|efe1%KZeEn^8b&t9?Q<<;BqSXw67vNU7>FxB*2tE z1D=<);Y(!dDf9KN%Q#xL#1rxMtjp+`>Fb@F(LEv7tThWK96ea1?Z@5=k*X)-M^Fkve0?)?6NI`epH$Jk)|5zoc4Q>7=Jfb>O^JR0 zb9KGiH?pCadBDJG+*=S5`2 zI8G*TWNmm4Li+ynX@CEO{_edTYxjavmk>G6@x<;3xKYwG)TF=bw3wB;hG^sDVSv@f z$!pl+H1)>*?!%EI7)=j;sK?1F>AYv5FnHBVk)TV{fF|yZOh&Kjd)c(lcuYz?bCqtA zMXKwDo<(emJPyCo6nO_$qCUp&lE)p6;KtEqJ<}VNWq~-}v(6|+AF8rxtht|1ugI$| z)3dC;+d+r_=ZVfcqvNftjqAP!$?<>F92-}HXvY6nDIFrOG_}gw&_Ok$?~u+h1jFv% zkD%2!>}GA)36pcSx&TZZUfxF%O52;Y;apN6Xr&0s+At1y%=lRwu1Ch`?rhzc9yEQ4 z4MqM5yAO0irG_nizlJ<{5Z%4^z{wyv{S-w#jml}?+4v$lgXrHE1@U>5B;NQa$Po2d zJYRgAo&_F^+tNQ=E^wep=+giChC!9<_MDCT)1FGKGq8STh1NqQcoo+$`O=*Z{1k0% z6f^x-x>GiCYV6{ z*|PY0Le}%~_3L}4oyPuAw?~g_y|U_KXP$ncH>$vJ@b^Y7mp(H@pV|a{xPUVHB(1$2 zeJ}|AYkk%qN1wmo#^7m)?mq~97M?(#$6(Iu_WTMD12E)>eduB)t1m5d3E+T%^BerVMuHXr0gOy9W^&ci^S>%SyHTXI-zrUov{4zazh}+rr*ua~(S2 zje|Q_?Mk#Ds(m=tGkkwC&8&-9h;(%5j03A7h8g4j*4Koz>-KCO$)!VfPjnwSo(*uI zMHQmYaj<;rBZ^;B-5cGF?#I#MGp`<~FBN4lofMj7IqyK^9>W)nQi#>}3RqzD?!zv> z1TGWk9*DyPV)wldrt9{2sRSRsTzDZKt+s_$^XHCWI26GX{748$d2Ki}zkPL$JmBqY zUma-e3P%FVLxI{r*!-%X@btGX6b`p{hFz&GcnGdmgx0p!cDShZ__0BSSGLr)-~n^% z+M-ZfV{==mNIykZ^W|YOe(R{M)X#bwb^N6SDvg~tcHX>k<5UpRgAMp`WI2B7 zND#WFPF1(9!f!40^QmJvqMunOJgg4aHiUwxkUY8$c82QO@v8-YFu=oYWJN9*0?*dF z>S%_V=DHOvp+LB+gFlD_TIJ`MA{FeY?F_Zyw;>2p7j`zIGPNxMnkgc`;RNHR!J}*# zuDu};!87uJi_U7mNN5+g;R6lrodLJ;QTB4NK*(4bjTF#|3a{3rfQ1*h#0P5I>I0^P zirTie_DG;U)Dnt>0+FUrV2sW+CQ$4A9so7e!sDjs!s2b&7HBrV^RQM)O{dzrT9=19 znPPNoZWFtVJ-vQhpuV}G0f`Oxxgro}tZQ%SYHf4tPG;ycqjh<6V^@1uIAB=XYFnZE z=|vMuO2T8HMnL-yJTfvO5b0bS7}FIF1zT#Dhgy){F2896+S`!cf*;fZ;@hogH{1dr z$0piZ$Fs>XDakfL&EVh1kr{9AM^pVM;%8tT0Bvxv|l3i7-6x_3;R~IceT_9 z=o&5Ub?EkvnN5??6OG{=n`6&`{1^y&Tcj4hi?%feDgvuQonicX6lSZ}wReV$Q`B(m z2pHdm$(5_KVHlZjMwhrdiC;8F!hsIyb@lY`R%CRI8}6=L<|0tKKXJ%DOProG8iks0vR56HAJv8$2^IGd6i=WM)Tw z^D;|3FAvDfp0Ou00~**fUe5H*M8T85dI;eI9tt;|Hz4J25JogO%`yQ?I%=8ej zDuY#~D?Z(4o9#dw@y4EcH?qtdSmq|*jLe*9N(BnOX+UNUq-3Mu3>0k7cq!92BV8>- zmL}wHLfd8n9ydP~-+7$;v(jrptvFVyZlB$d7l5yfGI~X6|I1PIo=o3*(Doy}1nKX` z%B`T@6*0Y0d+#voI0es6_mm%}Rz7gmmTq%EI7-rpf_Cj9%jwyZ#%e8;QPjC9Y&<7huC9lPG}`yS-o zhW><~vXXRahieih5?9IZ~ z7=>v}VXKVn(c-$6_-9}Dw@*T5Y~fKk_>&5_0r&vGA44AJY_4Arm4z;r9oPY`*UW_vDR;V%eB5x8$^7{X|Tvk|Hg79%tutU}m?a0kM}2u~sGMR*(GF9=5wxZi3R z!f1rE5vmXtBQzkaLfC|G2g1V$Pa*6@cpHJ&_A&t{{6pI%Ux%=-Y0^lsZ9n(Z{j2K> z@E%4(QceVUk}tRXN06Rt7_!;;C%Vef)=A~=qGLIi&!^rzPFZDU5nP7+yw)42vH0J^ zbgKXDg&WUZ&LZ2Lmp7#5+RaYzzr2QG?^pnG*=OugxbFad7*0-n4C4RpIuAU%V9Uek zAiZb{UR9v&1}y-aU0`Hf0k{veE$FaU8rt=M``Hel%|_WLx@J{WOb(1)v>e-}y8@*} zlZr|UCw2)o;hG7hMJ1)lB~$IyUoJPooEK1;x$i zc>&$t^JWP$d3|Y37$Cfsy$w>lp0p(xoj|M;V(L9YOc@7$pD(2u&k?V)QtN%24oldZ3(lL%S~KFuG}q&vONU_mN9LOZ7d*6f5;16ymv? zMU?CTCGA^?-j?!N1?p+vj82wvl5ei88awnob+Xhd{KN+{}%Q5(+e8qT%{XLYM z@-^exb~^L+GoIrwLoZ2D7Li>4J*4V78PLLB{&| zv?3){kOKctDb2R7f`%o2S~g{XbsdmW|F4)Q!=l2I`~^(O7G$bF3$;ucY^_5|nZG9; z$S{i|Tcv+6M(mW6tT{lc{JeWh$+h_V=q&%=XtO-)TR>*}hfu)j)=glT<6jB8rxaQD z09oi?L!?-crT+h+1|@=A=HJAW34$#1_c3Lnbvp9Y`)|i|ky0wUHTiF+qGwzG56Wp# z1C~;SyVBkTM@GtaR?_}1O?)4t%056n?q_v<_S^WI@-S;_qdm_Dmg-|0rn70OcE-05 zA(gEu)JGla7*Kx*WFUDx%TQHc!*)g&q2ScVo<@?VmwBJrgQz#dcMa_1wS7^5G`NDY z)0%nDYd64{X)DO2>|2qL)^a1%^{LENaE4dX=2=AjBfy$=q4gZ%%0CYcm{wznF8)di zyvU+}Z2x{(%pf^_ZkJ74WSxfsa{b&&l(yKq6iA-`XJAfSV%-EJ;6DlGOIvFF6iB|G zBUswSV)C*6T+}M<66-Uh6!-^Fw=1mQf>z@H2v$rBTKj>N`uT%)+A@o?*(CpdmQ!z8 zK&JYukuxo14Ted|{G5f-8bn&9|83T%(Rv&Vv;A+uZ_}Er13>2Zuc5RR)*%R}@&AUE zYqMrTtA+k+S-B3W_EP`LWQ$l6k@YhFZz+1UH5KJ7^N)s&(yp>bLO{Jg#F}0s)@kzB zu+ZzQxkzd8|C7k|*2O?N{I4<3MynXriukuuolVwcAZz?9AT#X-s~gDG{!f`_v$V*1 z{}>k9ZM}@F8~op)qBmM0NZafmPE++*D}mhPKbdSdi3VHzcTwwJ>zhcq%|C{w`Y-DV zAb0xDWuBX@ZXnzI7t?NAtPud){m;?XTcvUj`X6D+EmG(X|5McZRzV)|zss85Cde+o zk6Pa@$P@ldrraUO)Bas7=Ud_w&-oWq>$|KHn0L4TFjKZk%8PJrI;ZC`nxd8aH?uO* z+Ub3^cw)yEM3udt`B&2QY>a_KI`2k8s*lN@>*!byy(5G_;BPif^&!F_MwDkR{-izp zIpV3luklyX=_`_MnA&N+?|cK)RNpB46(%-xoXK!*qpmw<3FlmLvSVN7a4OHcwEcG* zCB2pD)cfjqdW7nJ?*>WlWjeLI&q*I7J=C)c?UVM%Bf|7JnOMlr6PS!Thv==}e_J?z z=Wu=&_vh7;>#*Z1#vG2p*v}bnWZ?0{FGwoT5&$HV|e~$5h{T|~#VLad710B+S z%5ulT(3I`rYCi3GYV5h2uJOYC;7s-Hz+b8L3yA1OkQmEF@=c(69;Ijh>^&j>nFnS1^$Y_foMQ2Q2R#*8?-MMe^Y&@;jb{U!)qonlILsojsw$#sls8p zEXE`*f!<=gYKGd^C@uJm!yxi%c#RYKSaF1 zeuiaz#dwMR7@PKM#!GFRHS1@5l7A_6Qx=h_{#V&Bmh}rDW&ShS=pGrcEB(8f;+2%y ze(qmROOZTt{GYOOrV3Ky{~b$D6J(*ki=u5omilibn_mX(%lzM?0s|yvnZKU3N*AQw zzl@zSLy#u_VAgA(AT9oKRv=T54u6Q!vIU9w#}XMN$Qu9owAWxkuJ*5^0fq>&-oKxP z4wWiwP&qdd8)mURhmK9lwRS*=|4JJ5WQ$!}`L|QAQzWy`Kawe@TI|%epX-6NJV7%2 zKY_8*z9DAH_D`XiPP5pzbNm+d8ZIfh{$i#CEV^r+|7)bDjTF%Vf0#BKCDQU$&Z*QZ z-^xSYp&4nTtv^$*M%I0d(d!9{9c%QunPSIT94Bm*^CIgz-Xh0PJFUt!H5m9vpaCDzB_&*`GrGp#~oN%gVqhj4lyBp#l#h&3*?&X>d*CUUyh zqfAa2O+MLbl*Cs2mF~33VHhMa(}|yk5;><(+EnXK$#4%duv>D**8OiMm{iU$=nB&; zj^a5VQtk7s*CfY2=Ab-I>+u{$n>Ubvk#TZl@Sd)q}Vmi@Um zCDq4vPs?Bidn{KT_C+Ari*3)>&?9}subDR|m)zNJV@>qT15z!7{RBGLzr z)GL}1Xqkbdc9IM)K|Ej2vy-6Cz|&bmwmOL*)yKRZ${9GinIiuQW0VdorjhNxF>A?V zAS?SGvP@u$<=7Wf%tXd>?U&HI2cAjsc{cAe2A0-=KVZK=70%LgMjh#AbIu!U^J&?@ zb4V|+??A4Blej)CQJx<_9luN|slFWSyq%v;?NKhBKEv7&{@96<|EWevkAKjAz>)K|O0E z<2lOn6!f-6-3~dqd>!2y=b-}DIp}96f6Ul8kHq<|KH|)EGCdM;R^XIV{|+Nq=SadS zr@l^U8bM;JkNV}l1ZAxZE%)Y_+zgl8442#tx7<_Qay0_ExgTN7v_6vCOzV#^i63dL zMbnRDS*)x_*3bQ*0)5U z`bLnoyo0yxw2QSZ2M=~m6ARu!1A4Y9d3qCp@POFtPTG>!2tHd2i0OoOnox(A0Nfwr z{x-S!qx*>2F>ayBn5u>^19e}F`z~^?AvgbM*+RPmD8}u1(1=ffQ=z2R=5FSA0;Exk zkd}jp&L#AhfnurDg_P4h5#?D0Z1gO;)bmpNT}Xh9Q0uu6I7Vvyyx0!a9wYAZyflIb z4~<5jg_5j3$+$a~aZ@Z~Ut-3-c*eWwT`A%c`(hcNk7Y~|kBXI;B90^_z9$|p8TZFB zejdv>GBM-GSjMsAF&0?kX_~{x_oY;^2*%M3D+ws?w2Lq_Xf_l#uC67ltO928Y;799 zfPP`HmNUeC1p6(7oxxiPtC0TjInd!-@Mk?9B5Ko5p$OhcsNp;C=iyjFITNNMA^!kc zJk}xwV}LCfg?D|yNve0NFBQ<2;d3L7r>6m_+vPVsAqu!5@OS}M3#1|2@M{aC71HO%q%y)n0y0cfxI zH{3zH|6b$8_JlXtZC;U7o|iIFyhY=ifDhjdxwpVr6J$VmOBkPFTW>Y3>Ot$M;rsFD z$1%3|gpGTn^6zuly2wW3A0V3yIs1j}DA-2u#Zg^^Cgz}aX!Shg-jC{9s26OaQoIq^ zO%+T6{WH)5h7Ki=44;u_*98lZoSlyW%1PGF;(-puZy-%9SX2$SwL00Td{WL`Ki0N^ zxsG2*0(w*6Vh*bjvQ30i0qH=3UP@H#*TvMkh)!Y;6_m@JGsK#L4)mh>+@bUb=%hQ; z)y#Dc==lfYP7SWv;PT-Ko95a`u0`bf!p$}EX<+E6swl?UOU`S^`Le@FqmO(A7?&7J zW1KgTb1OODb~xFJ1-Zaz)-~XyxxHJJ>9O0y>=TiG2JCvPNjII)Dna)}5?gAgNpf0h zg%SB$VwM!|*CO#Ill-@1O8hR<3%`f-DwL=j|A(Nlozaj08RB|HUvtL)M3&F+EU18H zJTKOapP24ld>RrjgCte-5gYVDnxF(U-fvsm@=n2dQ5R5>Bs>V)oGBe!P>&B@!Mkef zK@KDIidp1+n5DKNG4L+Ck)V^n7T8YS?{M|GoanDvhM)s6X9S9=fS@lBorX1+wS)S! zz|`6+gIxT9EE;2djjT74^*b?%OTk(&&zSR0u(EO376q4q*a;gy>JYm? zyc)zCK-^=9-mNvMs^A__w}JX6ht=u9h2j@kDD6i`KB|*#xL9#3Xukxl@JmGAM})4B z;$0e$m@RTuQ5Uqc-d%+D%NvbtL6-Ge&T31c4Yl<4#;9pP#e>dcQI&0fou#r~i3!~6k*b{BoFvthQ zb-!e$b5X9=R#5(m5*SQ}`zKTHASx4tpsx`XhZ8gh>xeUCvipk6V}J%wJ!J_xlc+eW zpzDaP=juYxZxh|eUhy^a{(|Va^m{>%5}m`A5_CKkL=%3%R3%fw0^+}*>6YqmeD@E{$D0k#t90R~y1CQ2I%Q_K$6B6?umzFnc$B{g7 zWIR}}im{$1toM>N;CLvUS&b|K#$os280*Qx`Z!sqC$QcQ3^TKOBgR@HtS^!EJBHPC z&|PTdFJgR?h3^CM-DjLb7P-Usfh~YzLv(!>37ZFY$$!$#R`4l2CFgXUdIwf^66u^7 zsB#gA)rM$IR0Rc~%?9lXO;em93#vf89K^6YcN>VSLEP*n-T@+e>G$HxrO&<# zj$4qe;IN6j;?7UIvk&%>Xw`67x900fg}tF5jC8IE2bpm{#rv#|*(qMXj>#lY&;v%+ zje`ff60J&2SjW9cE|RHRK@%c0_Rk$YNG$#)i2nnk8hs(gb8C|{ zDR%%&1kKtu1xr|c1EW(gSe@NWHqJcg>AF{JmRtciLcxAy{Q&YNAfvVfe&jjl2&f#z z)TBS-7MS;1-6H-;aGiS;B*;D21HXpIb2A0n!?{mpGZ-eH3c{HXK0=|;$zy?C1PqE}xqibjd$umhB+1- zJ$yFGxf%?UUjkt#OXiKh!?{d_c z%0~p;hw>ycS=+XcK-ME5QJt>^`X&#+jmlq9-n3zej4Va>m;mNE4y(09IIYE_oTO>Y zF`3-wVHho#iX8OQvysEmpztyfZBqW0MZD{fZSeqPHJrRq}9FcNHLwOIfjzgp% z6A?Pn9mnAwi!^ep^ExqdS>Kl%T<3s5Yg+&XPQ-Bm&j`JZYTk_;CCKsnxHMJpB#2cY zer1R$-rZ$V3!irY-o7h*2k8w+H}wKQS95NsWJ#FL2UaC0PM#I|)btw6Yu0%lYLMdP zcAj)T-J9=lc+~V2Dd3pzDHjfI{Fy$^3(6%PK8a27DpHLqp!D>7iEhWNmvM$fe~hssD(HjvRBu`Ar;Eig~ z{hW!*?j`j*65Wn62K|81@}poF{EbWSR|Z_t2Jr!8g{t%-KI9A;V%VSb<3gqxhMBKG zkwNo$pBqn8<^Khp29Kab_Jw$g{6s2$Ae(#mhTQEX7sqJfQsosePR<$BfdjM@qbj*( zO7n^H@ZK&iP*w5~`H**fl)~E+oy6>_aypDQWQZuw`v_N3c?WV09!WOd7dW*&2gAyc z2fZ9$xs){;9Z7|)&mxgaSwk#@?2J+h;7V5i^jkR`oI}3$lFF%37f5TV%7^fG$XwBd z>sU#uQ03jokuJ4m@6=+-&xZ>SIzlO24#uUxW*1?Q7*a2W;3RL9`2ua3CCYHJ(HWRs zmCr|w(hC{q?4wgy6IK2rNXk5EBchz|jiArKm~l4QIp4e3EA!BehU}KAaZYz9l~SjN zq-vZrb&?cc$t{Ix{gT8XNtaUjRtkRBIysdroc=Vm>I-zJL5oQ&e-f>eIh0Y3PR6(| z!YXM)b=5HhxQZ!X?gQRI7vMmp<<0sFOgm^v<*ksC_Geida%35FGsLL!srWNkZu6Is zD1VqAw*u^)vx|{=a4{*m9C3N6ld=X`r)LgH_hz1&IS4<4W@EkO8K%6Mlhdc9SL0!V zH(#ZvpNDjGXA?yuq-22#@dV_;ubJM=^mJyjfZ~^2N5Ukq`3;&Nk@yGTI!n%_*P270B zr98P?%OPj9TU%Y=w{(GH;!3l?v2nesha_k=&ZuuR8}CvG`Oa{qLa_p^!~|)qLI=Te z@L2Iik76*XLDmFRrQ}#;jddoNLSaH$VWKJ2pl7;lhtyJC?Cs?zQ|MVpG;Pj$o^4QO z1$vGy-SAE-f*uK#KQ~295XQ-+j6nJnQu5$EQ{&90D$~e=#XylY{p7fhBv^gAt0E}A z%%HIC^pojkGveu*P#zNokEtFqRh*>)Syg2$MO;y*%#0Diu1Qrz%BW)`U<;y~#A0W= zv#}J&=fgsedJ_(1Szl%j#9s?>+^{MOhoct9--#`*3$2NS+V}>pD((t*7BjiAuCBQG z>`7-AwlueOtto75>ng?u*y854x|Xi`kmfT;ar2o8e9Q3$ZURFBQrxi?Cla@vSybAJ z`6_-0Y*8Im3rFhfLk&eu&|L9-_b{TEa6xWvM-(F_lyjmTYxzz+$fzlP2*4ZKI<8-` zcT?&^;kr&YVforfDC{Q4Yxiyf-_Ld9t@7Too6>?qd)+wS*LCAzo&)SAbgT{W2wc_) z8bhEt6+q+8tHv5@mIIV^yi1?t>lTHf*~6d8ymwgE`4=dU&q|G?K6(OZpZ8Oyc-KBc z@Ui^y?(iHLvfVqn0e?=3{n>bRgFVbsG}Mznq_B8`{p!5$8PB{n>E){HLUBrqjT$~op;;x`txp^c3!bJbdPu7^{sY=ciq%0ylWf0o!5Im_8hS< z-Ta%v;%0lql;Yxzc5b7{ekAq#)yN`ZJFXWn;0VDd-gQUpTfJ=&?~ZTU4R*eLG4g&g zrMPh;giH`27upxs*jv5p-WEv>sor(>NNlP6^=51#^ma`ZkX|I9SrVbS_ak-Wg6c;f z_5R>mJ78ZPozi&mjTclGPiem8C-#WK#%7W64E}mkr%9Yzc~iS$aVvFN>Xy{|?56qN zaHO%zJK*|8M7%>9>?ZH!A9!<);GjU1pK43NsoqSjPFSlmP^gE=Vdr=kUGF`^GurZA zJk>i!>$!5NcZhwDb%Fi3JstWKPl!H7-X6(tl6OtSJNSql@D92DKx4HxyW!CrKPfEk z_MY*~rb!d8{4*>yZEJYN#f1|$M(t_ZKORZ-`t71`HhOQn_MS%}4@_r%A_~5eYCkEF z2Kjrh_kb$$-goWWo>4g$+S5YC(&nk6ed?|D5NX4alS>*mMGK3)0~(^Jxp&P6-T@JN zly~r!i*}L4s7Z z@eVjYdf`g%7LR9~We;tRa^!W* zS_oPYid2Rg6n4w-?2dL(14o3kH#C40h8jHT0Ld-XJn3k8)VDr_gHy1(rfoS)($P|j zQ%=_4$aFg#;-)MqELi&K0mMnPWy~#XE4W zId-6m4WvS_KaQEvrV*+>B|mmvdbp_;@*rk)sCI>%tAQOzw4*SaGaN$oK~Yk*wglNe z2@3Iy9DN*!LK8a&$E;XgFWNa`b!%W&3x*-;7y;(=nATuJX9#Vzl1kpoyxI z4!4KSMpadZVtIHBPN8X+QtN7QsE)fuYwPPd=eBo6sAL^{GGeUZI^3RZ8ivP8lR{JR zn*;}hBgBpisaadjIag~atw!&J(cwItNpXY-{&Zm((%6QBGx$=A%f&iFtvD^D9yv~Q z41MzF4fN6i>|BK)<*#vZBG7Bh9O@0K-Oz z;*MsB=Qk08R~9e0XwD3MHWK=xt4|%%BVr$=faAC0=%9|;`ZHNC)?1@z9pi8ONhQI% z=IYN%=tYq@IaV{2f)55X)wQ?MK@+9GMwF7^ANrIe85}r%9LIy4;Z1)V!8i|BgKf}< zM#1MW_=y1NZ|u!DiVDqy!suPlr?s;Xrera*W-U90V9j~kj5M=0%IR! zfVB8gN~UXD0M9H^KM^3eb3HX&6j*zjka~!RIEz=A#RGY-?_7Xs3cuA3ZM7 zR(jZDvD8gIN)d##W36lkA*?eK1i-=R#28G19cwX);~<=dAa~QyRrUA?;q*c0vkg*t z`Je^|7&F%6+@3njGw~j4I%->}u~r=OUmcGn4!k;foJVbC_;U4(&Tvz615U@{EdVTq zl|2UotdMciQ-pnm^OE~hCD71l7N2RP^SVD%(i)_-`DLa+g?@1_P}myjY70$k49S-# zfYx@_HBIAk&hDfV4gN&x4_Nr#|bLqM+t6;JSIl~2AJH(T+ z!f4o)UCo_qX(9J8X=aSliu7P9w|kjWW=-&2>@;#7hI1qpyOI+D2whm=ZX-i|wShVKzp2 zWODjqM?3pc&DzDaou;vAC(hR#L1@hQ5~`Iet@he_<4R=_<4One7XjmokzZjI#tzkW`bWvE0>*R`7Cp1;>T?`!Yzn>^ayIu zv69`hrj-Y zAN>XOHp|?awbjRbCx=BzyP;{t6Jsl6y((h$_1%Zab9u3LEezb^J`okdatX5sKg+~1 zDb|^Bb|G&^6xHG23xz82SR*zEB0E?6!FH@UjOWL@zca3w#^85+u>NoF;1_(f?c|eG z#*A{99vF_XzjKE{J9C7io#pNe_2EoVvv!`G5$F^bTQk-*;ZDQVKU(y-hc;>s2OE=G z8U5N-YstkMykHpiXS2H3uFgG!3<&WFhU*P*%5xvNdvY-6xfar4X#Hs`lWjhPiUhU`4zV<9-WJl;z5YS&E}28Z~qA1a`4 z(PZV;+9Cdx;HSn+W&xs2qYq!ifD9*q+tLa$?!cTuX2ylBK9?(E-25ho4}mCwvZQrT5N}>YAuM&Uwvm-3n<{24 z^PQ<#=EGJl+q>@!Vjo>|O*gE^^7eKJhOc1_iegY>8k61JsHq!=U#T)qkAkXse}>Gl zfix)*ej8dXriUCe1xg>rJR#(+_#*?_{OnR#J=oQT<0|VXN;P3`y?%y0IL1pZ^La1x zfiXPvR;S1#;F=zQJ9QL)<>D_)Cr-sr*s1`*QZ-irY}Qfym1_k4o;bA_splae@09>+ zbQFK(Iun0SoH_%kOA(M)xbbJ^u_SIeTZI6w=Kx;OQ76MJpmQ~e;D-`jOh&#sYpKN! zBfs}}Vlm%Gs>%EFWAkR?F?AjSR3PAyY?fNG2H^WT>J(B4v{*OPn1S6Gij^1WU#8awl%RkZNuP*si0FWI_iiS z1GG>`H3Zuwy5xRQsVzCAv7CeKCvEd18&V45a14SVM51 zL>I;LEMlJbH3Nap9y80;Al;}_3BHZsQCpWX|6`i$D95^;xaL&j|CPR!{3DSZ(}Ae5 zk5gCxzYI)6fW-;!m*^6Li}2&FPkmz5+{;)40{n~MrC0)EpXdYvFZMI&9LGwZPwB6V z^hE@JLh!1Uk$V|&ikj~#YLUCB`S-G@Po=0u1Wr-&?{$ir1vwWWpdtkP^&CBoU_XLa zt-AJJMp#^`!Uo$3c~W#5gxPA93V<~7USb0f{Nz}r@+RipOLSZU6S0CsCZZD)nBq2D z%!+g-B(gHxF98J!d%a-P=BGL zt6%bMUFfoWdW_`K7DQ-EJ`f#sU6~zy6EZsrCuDXsc4c-{c99&N={?jHqno3$u2|PG z<^{#2ur`vWIr_$PI_hfkYA#1xcTPvycuq&xIK@$w`tj@s_{>RYgOLb`62zO926Xs4 zz)K(H7*q?$vXFs*K1Z@s7~@X1eq>{X3~QT?I;nRc^Z z)@81;E_0-@Lpk}}yiU4X7W024%3MT17i19*>s6r9QQcMH`9&i&pTnju0bYlI>JdaF zy0{B~d$rJAZw9zUqBR7!X{wW-@AkLrROZ>BqXf){!ds5zbW3+qKfqR)zac;kg3ly6 zpWtNf(^HEH#!0k>fX6R^>SX_KFuo&sY6x^{Y!a9Z5)XKQa00%%0RP?v@T`uWjSY0w z2(CGu2O@2h)EWYvXEF0Up{WE8)I{Hi3DRLx+n^+tvVCIZzLKs z+cQA->QsV{CA#=JD0_z}9J4<2{a!N?uu8Bb8G9sJL-2h~by|$lzSemNbe_c&tQlj% z`;j_Ki(%@6I!ZuBcOBD!lhdm@vhQ_x1#!4B4PKTyDmylVj)<9}h89^SR#|d3WRxRd zin$!1MWQtXoto;@VLKX$A2Ri*l6%?ybUVh`YCO?_aYEfz6YiyB)FF`WmO)=5jZk~a zlDKm&NtR3(BR3%>dX$!|%@LPONe?5qx(S^`_orAR6HV$a8$serAeNd>knCw}?GyU~ z8-WHysceFz#@q+eA0;*B?Wf|NiSK%#bDj&pgBcNZ%rpF7rtU=QGdjbo06gHpm6vaX zoH%uA23Ai9$Z!b&kF0U!E&G?LuOanyoq>lj{!vE>`XoA^?_Xd;5G4|vB+>ZK_g$J=mKXD#?}GLi0{993TcV2zex<37U^Khj zcy0l_#~}hbH>AmQ-lP^FtVdv)bB#dccy!WugV}+w9>KYs8_#6Aa~HT9H+g)0#krjO zKhk*P=v-rQ3v~v9b7RL_xy=a9#oM!ahIXfmP8x5_NZa9}JGW%X^pUt*I32;c*WxYJ zegx;b6!9w%mLV)hU>a|FoQv~!HNqnZKS6M=Cd4@*J9EB6cV^Eu7)ZJioa+sAv9}PM zfps&w%$*3%<&1Qsv4=TVE5=0uFx|2^wI$9#CNPZ_MituO3B0OViMpCeVjxv&LIoI}K-{?;d7KT%Prkf-9h#g( z(46QF#G$&_^>qyOufu_yG>~I)mci=L{`JOSTJNM~D+kLMx3 z1HL}Qow5npzQ06pi0o80vd+-or`7h`YQtC5F;1)#+f()(-;mL2q4!$OrZf2Cm;{6egr2@ zybyfXk7i6?P8zq`J8`D`;9@+7p|a+3(oRm|yYF&5&~^Eh!*{yjbL#Q;<+yv!cBJXD z$Xk*m?}uUBj%FtE5u1|4cmDNwdhI!u4==Hajh&RAZNN;+g3RSa30>LMh92}wG|))U z=OVCes4m9>ml@QXx9YoTkmYjZIk+2gOy%V@mgU%~aa}UUNR8_fI2LMLdj`imjq8Lm zDuc@_o~~pJ)3{y|aIDg}&d4!I<2ob99*ygz0LK`O>x>*rG_DyrW@sF%L|hyjczLCV z>oGv%dZ1!|*SKzI_G^u^RdoN=_+Y`EbIZMQqB{B_`lC)aBU+h*50%LF7(PsJ_9I?i zc~f7(A-X6@9MZinU_)dHV@bxZy32@erE@Gj64S z|0eMvm>U3D-c~? z;{I}y$^q_NtS^5ga4zDLlJLqTd{Gk4J8$O-Aab<}r@XC6_&qM1{7<`Z^1lq+d3}8_ z`XkSZcjn{4SXKNniT}eST-9~r`>ohxftRs@!SgHT2j^5TSctEfV&iqF5qn`no!Byp z{UYscxPd$lDTv)X!N!*M<+a#Xg$0J$=Vv3i4K1-`HY5 zIX=ay^sR7xS8FRas+${Q!DOdh0&C)4zJ$#y&Ss(nBDP4Foma`^W40)hHTIR-#2qzA zGW*2-)t=Xc66D@Lfx>M_*ejj9qulI_PGB|LLK0|+dvg+!%zm8&8aIX{RwBMbFo98T zB56(Hja4{-H*qIba?&e%t|QDwZ$oceq1T2Ar$AP z(_pY_{*1XZgEQw&MpFHu%j**Y3gcQQM4Re#DewVc5Ih#tH zLgjQRh+-dG$Q`C&);op8MzMWEe8)rYfJ@kDGy{8)up5l;-ULJP5Ga-dWF_4U8ThKw ze0u=FYfg1}MQ~!#grYOuhKnn4oL!!xhki96X$Par^b5G- zRV(4_d8b`2h`quUY;0|B3u2>UXM~?}c5S_PnL>7sLm65gJjpxL6L+%e(qgX@Ia|wu z71*T~331PuRK{%BI{ucySlM&|vzao1R+aSXPY^oHgFC?i@R@4(h3ws>qBXU6wMQC- zCG%wmu}Lt92Zy@epdbGw3HQc&qjjQ#>h_^Y=E_D>*SiqG^H<@$4LzY$@Z;QQb?r+u qV)JtB@z>i}wYkh@LFpqW=phL&Y8-Fttlpk&DrpprZCjUjHvTW59Uy!F literal 39156 zcmeHw3wTu3)%HF!ljIB;CLxIsHNpS^0zwiXA}E)HK)4uid-YpdTUwOWUY^;(Kwt@+<~?Q>?%4AKAlp6_}7 z=lP%KKd`gc+H38#*Is+=%QjcB$K`U}NMy)aXU+dN9`K}fggF2t{b{wnAUG2jfOgH1vn3b8{W(im)7 z@a<^*N+j6f3D6j9`X!(PJ?)}=sHc{I?$oagWic>6>&7?_!HqC)@p2Vg@A}8{Lrw(u zEq!PI`@=6?{Lqtq-^&1v_F-Kpce@H0foIFT044oA0=T9iOhuT6aNm8u9RKcb-}ld+ z`@0i=Shup^XT2Z#AOG_=HiMLO-9RO*i~9b?Mi3J(aNq&Ji>QQkk$%06ASOOEMc&s^ z_-|oFtt$udcWeYP^FNS+pO+%9HAUX36#l6W`IP5L;SZ$XAEn?+9P&m0zAT0Qa0BBi|26uOy`e?ba< zcMAS=3f^TagP8hUokH(PDepuI|EU!IcT(`C6#Z)*`2&FeJw^T>Q}VNa*jE6+%oP4( zHW4xP|3*swLX;mIs?>VWa#W@ojQB0!ymFLJ-4A+wrN*;CeIN-RA~N^+G(AUo)z3h0 zit`UqDimsLjkJY2qqQB;P)LQE+nS>))PP8Z7A#v7st z>!P8`+Lo3@;b>E&9%*wo)`gaIwMCm-!*e@2A{|WX=m;$hN0&xBn%f#JIm_GHYwOn9 zf|iEYb%opN!lBBhaNSz4R73gDvQ6zQWll57uwY6jXp3IZ+8%)kbhIc^-{sV6UN~A2 zjdsM#wbWhExu6Y}Lvax9sDcKO7Mk7F+)`gt+tNjjxNb{n8A~-Myg0nU$yQa{83pbT zT-DW97j2HTAqghzR3Q|x7>xqOy6VU)W(a9HG*(rlqqWu{1Ql6;wq)Uvwnp0)OIw;@ zF{hCcuP|p2;p{Ga#3xx zu1S27$(1ePT07rGVY-{R-2!xqP+dp3v#TZA-Vxcj38Gm^)LaVG_Lh_-;o5qVwFiYN zJHoZm@T5dSMSZ>H9WBjk+M`XN*B5t2ic1ynIzm&>C*f3eYeRKSYeNmS%`GYvuCI;O zB7IF~r|zmqYO7cCsu#?z3{5JYSUfonbLLLI979f=fMMW&d>L3#B>uTn4}@|IuR_Q9RvfV6ax0!=#no24(~57i;zzA` zzZD;`;#aNsgcW~c#h+Pm-fUg&d@HWD;?-8%V#Rk_@x4~O&x#+k;zzCc2`g5WTCT^6 zO)K_Uah?_DTXBIE2ducripN`VsTG%5@pLOLx8gZgJl~2B%)%PZt<KVgh@?8VC=%$lQ9<4`HZo+EMSZUXMiyrqLA?brHUA5Dm9)l=C4x5aIP}O zgRt&o3_Yha&Q+?MF&4IS7@wike8!k8s~KaO3o_1EY8hkHXC>pam0HCZi_X=I&%s>E zcqryb#>13qVH{AZo$+v`qKroSo3zO5MhIBJLd+PgZJa_X#t0wM(gM4_*Ycr~6o6U*EO^(X`kUSg-q8^YVkL?-8!v z`|e@C;njB!C-x?S$I0Gz4|`t|$;Xch&Xs->6OSJd90pKL{B!(4!MWOQ3J||jaDq+H zS{>gdI4Y)^(3FKiQg&sYT|o|?-IP8_=Ci^2u{_S_7iUxyoLAy;;RLxs!d0T2L+E3KT5n@ zaH`()D)CamHxoZbJRtZM;xXdcf^Q}M0dXbxcH*aqfABBXe5bpqy(D{3Vu0Z;XIpYSc|JKFthcF$Knd;VbWdL{Y4C;2xd=ckmhN1r+6 z+VRXY$A=k5UOW}e>*+Z~LC;4ApeqEI^u1_H+Htb?3G^tX<*g8TW3;?2k5iKB8q?GL zs@7rQ`5KWPSm9P+59VLPbSXxEa?l9G_&(TVFK0XK^+h#oJSpx8nn} z)tKJy&Bq`Ve$&%^1mgNiW3wQtC!MB@87L|}I%VR4p6Wthc=AA2qH79BmtPUG?HafI zySK#KySv!v`i0#R+USqRHu%s19>qwn6wLGdXEe{ZF#&d;D2$t@K+Ka5Unr%C@|}OW zvr*qGJy)WoqlLlPcBydybz28x`A{0nzoW_ou^@Kte_EEx+RB~_hU}hiqQpMo@d3}9 z7W8z@6EquWeos#fo>aQPuJr2eXA3WfFKPYvgSGG7H{$i}?Jj%6w&Dw< zmBv2(R5Z|>KeqD0&b{4>!TRni;#Y#7L;O%|CFbm17T3BRU192=oNwy-@J(bYn-mIq^XEvp%%@S1{61p?RJaR)6||;B!68 zE&TD6{`B~+-fqvIQta~wj9E}j+vh$p#Ov_HcmJLJP1hfFL;bM?=suCx+r1O@V#|+@ zwdt(v23cEwsVj4(3dUYxeGfZbH*4!-AaCo-+Ip|pCT_Ry>WXU-v`26E-z>Y;#QcyC zyRi%O206wI&f0n-<-8YN+}r(ai%(Sf^FO2(aKeHW!QSqBKwBP+{Yxw8uorCGl|!q= zt)$z(#L&Z6+?dES@qk#Fc3=(;X3~X@m-S&Z_z4tANv~(Rc1&x$UmCj-6}?kc zXw-tfc3&(_^vb{d;PMqaepj<}$DvrIu;mI{Q84xvsDDM ztscrM_w-)nJ6XQM70p0KU(ZIGrngHcxqG^N7;(&=3QzAPz8%X7Jr-w$50X4RoJv>*czOo+$V{gVAWGy6kc6h$u{hV>(_`+zQ$MeGryWfJTx?b$@{0Not zu%CPWP1C!Mi5jK7HGMnE3OTQ^KGBBmXA5*|*mjp{pGZ{uxCbI3&DZ1FA$p;bu4pIv ztJ#wtPf73M^xCtzFfY+>Alho`UE~9q!%%!UWi743;aT(1e^9h1F-))2HD$NdD(V9A z69pXKfINx$E12C=?mGI<`I1+9(eaxy5)MGrZ&>w ze+sGB9=rhymhKY;FjX060o3Ng?h~j-*4D#V<6qeQvcRt)6WnV>-}=1Ru)kYp`G=)tgZivf_kca zJw4B&T+9wxTlsLGtijlNUBr&V6JO#G^Bb^U_yc-av;;nj83|6gVtMRhT@rm{$05wQ zY2778bUj*a#|PTA)+_ki=h64NGmLj*_Pl_q`C>1B99JdUY3uiNJn^u!$Bv)xh@qK^ zFunCG!ji{omE|gH>l5s1SvwBtb{f)kBg~1~TLbrw58|%#1>@7ilMXd89`$x}Ey9uR z2XAmRUT?-;{3xN~QOoudYz?DNK_gu_)Y-P-a~TSJJJqI=v2uEtre4Q4CHR3m#`&4ZrF)0;qf}!ZA4fql9`)PLj?ZHLr1=2- z`%-9h?ZL5yblz*g$luVzDgcoft%-(h~ zx}v9BmPu8fu5)`<(*EdaUE&tNf%bx?D)(i$s)_yTebF7W{*;~-@w=29%LrT~9kk~q=Y5BBz4&aZKF@2J+8$4eJ?@O_ zBje+@&{o$TY=kmc51~DZ&_v^FR>UH@CYX1gi(*jr?TG1N1^uX}8$%R(0T!ft<4RAA z`IzN|iOko<7m&|&9qj3TJ#peSqXI};3+Jk$CQ+;3W<6Ag1bsq)SiXGhr7*k{O>=HMY_hM?6QMT#txcLmm zUa(1+f=2erjR1@9rVxX-KNsp!WkkjL^zw-Z&<2Sc%%!o*r1Wu8x*4nfTVJ0%H>#B6 zTqg5D(Zv_zNpV|v17GKaI>S*sOpbTwc$;zwe617db~_go$Fd^TkrtAbyIP;t+BZ+T&$mxt0nTV z9Pe^!=jcb*jR{3Up*p?^f=We;ixw{)J644t9gn(OTGrsXcaqSJb!tJ|db~@jUqT%_ zqxzYA(!==9+JdLIe-*krlaM2)sM!!b^^j3O3iRZ3zcDyW07} zC(tUdn~GJay|yFVhId~Oq%Q7gMrCSS0yI-p-cf}Trop3n7%tKfh~gbUz>&^sz(^QJ zorVuIL^=XaccJJXgCmU z3J1pMTw?;Y_WKT~p_cVa(S;@2vMtbTy~kp$QkqV+b+xVucaUP~*xV*|DH>HjHc;Q( z&;VisUdIFyjCGNguGTiE?qr5O6|HNU8@nQ1odJubt+o}qk1C#2TG}}VY6P_Zz$2r> z1JRC6fiYd3;ZRHMns5u~5qW15h_r#;f)|DX@$FW$8=g?~V-szy{%mp@CDkUV8T`8+ znThu9Pj0`|(_~AJ>PI$OJXxr;Uvlbc!s4A5_N|O`wbTdb8ZD7JbbH&(R+G^aEyLS3 z#~urL*@^VFXf59RwlxMS1M9;bop?Le$yTq6bc8LZ2y*NQSiTFBD@SL;FtWrNT@vmj ze$gE5475wHtEYdrBBNv6aCYTlXE%ZPq%kYd+=()3*Pw6LqUqOQIMb>~r?Jb%9++^n ztD{Xih2^jv;dZzcyd+#7ShEQfNOG1GsHJ2!3hQ)H7%Y)MQM@U~qdxWFjdXUngfh-{ zU$`H9gAq1jA@MTee5~&IV0JI!`54dlBj!5(2;z3cuOi-xIEMH(#3sh>e9RX`m=m@# z#t@$E#?x3#k4F)2NBjxmjaa+9jC-Bi5XTVbV}hEF_a_^1qq8p^( zHzA&iTjKqQPa&Raf*&*FZHW2oiQjkA3o&vxh&Kw1I99z5?|4Skf~tn&L7 zW@Sb_8`Z3{E*v+ha6~nd%MtS5?d!V{-SyQ@pJs8^ZkKK{e>0&q6+``3PFR(=v6|R?=M~G4_rRL zpIvd#??c7Rio>W}W~B(J@&}gMKog2wjdEispAXr!eNcY4d$GTCxxZ|#f9hQS^tt}> z`TjYx{qrmQ)pPto$iK)xeIXM|U5f{xh=baG^D{5?Pp$AzpD(0K2Kc8g%B;lS`Lxw` zgcnf89{AH|fLYcy*7XL~^?FZ*Kd(Ct6<%)FZK++)YJXsv4Z{Ri4)Eup#B5Z|hl-gM z&-p!-iON;km5T$_wpEaMp}z=4KY_3kK9l`kU*9CF-u>v3F#95Z(QMHRx?Itpf|p4d zx{c;aqoB!j8^Hqo=)1sHbCC^@uQH`xa})JiZ1X|)075?c+Aio%n6~V8E%q18^9Sa` zA_x5*^*WNLgJ&mr-c7C}I)G*GpnrOWzr4m@y23wwj=#K`jm{QCB4F1lf7xvR)JnnG z*wy`1Wgb+t^0r9RSNTi(tIF)mDw|x@kC=+g3V+!`hx^R!mkDLTyHJGm#R7~kdoV8H zb*WrI{4GV=UZi2zOZMmSs1ZB>hDW=ggP<~T&s~_gP?FI(<~fq9;J7WY-B!qa88Vl^ zo?qa%r46EcrMUh@{;9KVqrtMUCakyE!4R^ojP%RJ$lB;Ym-OQXb267YGA~Gir&syQ zFY=exN-;1@|8`p-Z3Obde#FnsoaZmA@K2rRpRV;s332^Hw&1VW716qA7g=d1F0z5k z{AE=lO4nK|tKszngsIx{7-+Lx5&&Fk1K8Dyck`Gpp2hrvcU;MBSbzo$CYo&y$N|hH zN5IRmlx^c2KQ|0W833)Jz1p8&;is(m{_KVRd__4;kfSh%{ZHg@zIhOGrb5n6z^VFN z<}av_LN9eH#vWuTwk%mO(FJqjM#%fAC9l76O8YdOyWiFYdA9hz9triZbg`X?0Z6CJ z^B2yMsRmvMStxH6!WNXjALXyN%6HlqBhDg!V6i`Ykw1T~UAK$)xzDP=!vFqxUt}sWV^~my_`|NswdnxFFGC*J7xWnp&s^|vIamZb zeF|G|6z7MnU?RK+dx@|ON5w$LHXPa0g$H|)7Np~;NCe3W!%5_nsT7u=5xgn=zjkr| zy?y-!_Bn~bJx_xXMk7o?s6wbgXh2wxa6Q7U2=^oW1mO_ED+qrw6R-9!8IZW&j(hN&*DmbKieDa&dbS^3 zKCl)o+@B{`Wjsd`u$s>L-@FcBKUur2ydy8u?dvEz+kf*)3!q;@Z!Cw@Db&dadV}2EF$!kggeVZK@HoXuquf+k(`{cs_aT#D<9RaNU$cMD4g-q%H znpatQL7-?(cujL{TcE6XTJgjQ6VDr~A(cX$T0D8e#8MIg$!O#fp{%d=iW>9~`?_|7 zwgmnfjToAY`501O2SE3+8C^#(4!K?~MJBf=;~F<2!@LLm)a}Z+0$mJ=S4m>}eUg|~ z3Vx3#tr-vc+-BO(Fk8CKj4rUap2i5}KED={Ttk_&dz%PNdkQ?RZ=g)~)`%|V9~ei{ zJgzVz_rA-JmhO3o6eE2f3US@dB1#V;CF6F0H>dr*67@81McvX)l3kfkp@6i1{s5rI z%mPo^XM|02B}U`4e-ZYX-$J=*pA*hDbC|b}aGtju-6~BPMDo4&L9aAJkOJ>xNJ?`F z67YV+>>fc1z4Kt=v@}7Ayyv2}Y3YKD_dZ2wroo+urQRWwHo&+RNSXHq=J6R+c&c|Y zDcOQd_YOua({hZfKq>crBNNDAgG22c@7-vkv>`?{kSgya{7uU@Zh*9T-VbTB0^?gi z=6lbgfKkRyFjRXD<|#IA2eQm-5-Aa6rI*h=(nqU?o-fPR1+X@TJ|!N}Bi5#CH)?<_FZ{ZdTW0zK6eQ_p`Pp z+H)bWbPwAwlTAytecuAWRJNw1K47PgLFyww29np+h^l%T?j#sQ!RZg}2g%jTypJ6O z==OR1aAUXW$wia_S5Rg~vk$Few!)YhYssX{?|_ieawF9BD1RMV^GL>GgQ%C^9A#W= zJONmF7o!0)f`;hgeHli|xWu4&S(&6bG+}dK8?o1V3_X>qZ?*48OMQC zd%s3$YmE~S5cEDxYqc43q17^P7Aw~-)n4g6Otz>o30YTp|3uLnjOi$6wRbpdlyS8& z0s`v2n_1JZiFKO1+`^b~t+5D{7H=*Uz0SB4NW1qr=GkVHpjuJyaH?~?aRHEx-Ui6b zxWU)~WV1JudA3W7Z1EPe&>hBMWZmjLpNigSaD3SAA+L-iN65 zHwD?}zT@RE|HG!f{^YZ*|nXHb>FL!@E`b_ zO;f#xFo=M1EyACS`%eK*_k51OLZ`0?-C|l#^L_6eq^5gD;;%5Vp%Y9N=XmP6cb;%A zA}2fcDw|WeUZd^5-zfA}(y9061pR8N`)@Z0y_a-qd6!KeBt6viQ?yUUK0bv__dHA{ z7V^s^CQF^owCxW$45fQsw>keF=cI7WnQ=K1$7eizJ^FjjnyvJoW?p%{PaEGvjfJFEHDf z{siHG`3B)92^X4AL5GZ|SZ)#YrEFJ(RehQoyY8lIJaacV(>;6fS8DwX0Nn@zv0RXM zBGt8*p8fNeg#T6i&5b4TLLk+C=VM{`6n{nFKs2BhsQrUC78$X8{7v@^#b04!hu2JE zBv%^!ATr&1lnrATzXDS3y?~AG zk^y^;_b@4Lq0IOGlg*wcd8)ntWams5Bu zLRsy-gtf{Pq~6;|qx%GD^5(E!0|jaEzQoG-1!?#GowdmpB;@o5ThiY|k@_GV+bR(9gS$Mm^JD*H+$M>UEZ6_ISsVa<;)v zZF(PN{R;%~dH2Iu8Rv+Zvc0ourlAJ=cAj@P^%^FWeD4%e0tVf+!22oa86!k=zJlT?Vm1QjNTa=?#@y?q#&w91X9d{pT8- zQ}PDU`>V7bpAw#@;b!KYZ`>lqeAh09Q}rOO#}Z|!ydxC1z&IeRhiq1^lQgSL9O)j8 zJs3UZFWn{G!*B~>#^_|6JpUJlizA-c~Ri+@<)%fEp$^zMS9(uN!L(g>4%4P|zmF`&yTE;n`ZmT;0V2-+UOod*Eb>FEDwZF|e!-`~mY4ILE;A^qf)0^eLS4 zicCJf8+bm`$D5Qea4Oe_rONehP{(U>0h#Wp!e8kTY+voAdY-%yT6n!-VOmQjy3^J; z6RV_05f^>PJBaO{?zxGrkZ+vxM=*+=jG@|2SHP6UFy=CIuvI}B0m43$Hvz_Q!rA6Y zsAr5IoTpq5L2qN^Es&GH9LgJGT~xq0A4WU#LqcO+0?*S#<~oxeiF8)rth2ucBN*qq zNI2{4!<42G5Ys)>FaHH7YxuO>o8oeP4!J(buI2iia?f(g)d=L~{}rQ=@xI(<8h?sQ zd|zuVn!Yc~YAx}7nM5p2|0M)VQ;kq!5hdy+yD@T*UH5NliR`f!u^`&ot_;0`Kl@?$ zh4C#BsLp9%EpO!mk((gU*yG02t)XJUTWLVoZY7U>q7WVso83l}@fyzOSphMfqz#qS zVWo)fj&pyT+|$WDKh7;_GN!6wtC4y%&ix&7ZzMPWXxWl>D^QHvyfvpfT9faR`%$Lz ztHp#il75&Olp4919`v-XEXsjNP|4}2WZ{PdpB7W0mWARSPm9f6yFF@TDTEs_$;hW& zI%8KnV=OsiERpe6I#Zf>03V6zj6aNLOcMu+mzXAgBPITY?KMI&^0}GL_)a|Ih~$hT z;u%K`LDx6N(HeZ#%6$vQp5Nk$oo+`VpuC}fLZ8)aC~kCJOQ$l%Gm~p~{g}(>1{T&- zB;F#}A7P{--Z>Z(=nihk9<~c<5s26Ab0I~HN4gre7k{?L3A0I9NW$21R04>)FHW3F zqMZCOZUc0_1g$#my8v1U{KN(f%b)ugJ$@m*htFZTN5a_Ci6@@At_v-n z)pcE{Yv&odfun$hnPX(Isn)brqh+|Uu+?K^z_GCUF*4*>Skt(@C~z;ec@Ds@2+Tu$ zM8AyyM8EO3vZzDS$NA9oGbn28sl#Jl?Qe(TZX^BukoXsxL%ZK0%ZtnjuhDIf2$g$( zilwzQ{%zpH4nXcFsP+Wuf4>vPpVQXEUd10j%F~oLgmO$MAAmBG6zRvugz`Bk!%h6r z>^hOVP*J-Fp#Ps)&0hdGMc@R0+yH<^6wQjOQFG9aMhA__=g!=_VeHw6ZB4p8gaF?Q ztmc>#CEEoM9uRjEw2r9Mwu@9gCJT(BKMVRxphZ%5LHmFX3!sd@p&Hu#HZ#|Gn9$WQ z&S?B#TNAdCu#|+cL2z?;D2x+(N!%>NCJ@n{sv=IjfyA3g9CtVBBsG5wKyd&mZvzmc zxR6gs6KtRozyk27bHC2Xj zM1RXN1RaX;Dlml#2>K(UzhVXUQlCp9H1Isi*64PkGf;#^e?hc|qJ)_@I>UlMzm5lg zx*1-fkSP$ShBblky*S}{5^6{oI~$230X!Qg{({77NgVf?Wu$QfV8E^bQYHYnkw6f@ z9R!{N@ECzYNO+OJUI2dqpw4aQaQxZ~7?Uqb@E@inR`Mai*Vq=fprF!sKw=wBgei?u zt^#JmCZqO}>rJY|_d`+1{wT6*|9;bI%7C=fTV(q_glU5b8Us3P3u=BBGHH{%OST*g z#%kOkB(l(PBLNu0ku<6iyvCfa546T@M=gG_^DOkBy2vl*f4qo#4rBIOr?;k zwGs3xqIW|F<1cu#AxKUXCI|iw{C10ZABivS*^ymtT`A}|DU*pbGKqd=z21@JlmHF7$- zyK%i#f-f&ikY?=J4@l2-nu6|B)=V}IOz>6RuG=M7J*qzLJ!E(X^3Ll6z^;QD zJVuQ}Je7is6&FxUTm~jIkYqxeG6RGyz&3+!?0FE-`HPYCAKm=Pt%+TY&Li8)bh8D$Bkf@l*;z*%T9(0b7Hl%jRtcU#sp!Wb8Q)(D`>F zX)Q#ZzYoBTEPFoymfen$`dIdJNccX>-p;aL0(MxJeJupA>=B5kQV`0fn79m#J0Sgv zQ~L%0qQr%~GvWL4pNbNHWZsXEgm#?zxx}7n1F%4Q8)Zx%3}9>?R{oR0yw7GeRtTq2 zGr}fKXO3y)E`j;Sor4_WU9$klFpUm?+@I0EUIj2@1c0{yj3@9n0CbFTJXVDyHDePx zsqsTuE8AzA8GD9;T#PUH9+UJ4OWK5_$&_(3fCU7844|1ZGI_gN3{0LBc+|{e942SF zC?(CUD#5{fdx{qhmzvptkqy16TsXK-U}ibT=gVAt4wL5Q&V!jxAdk`L;xm~vH}@gT ze850TtBW_kY3?l*mfXFzTtm&wq1;SLvj(70 z&-V$IkAWRBmb!TtJ!=x3p_gv}L^rHlA zkYBS!9~8hn?YZA|lZ%6vaH)!guu$H) zRE`6fl%*=ygD1lyUclvQLZGTFfEKy0dMKqhPGWXd$$>aGS8A{znN+a>xpGF3Ekue{ zWj;{Nz1PiwjSCY?qxUe)`OahFjfuoE$o7>{z#U8^RaKq^&fL%4OnuB|wQBGL7;+bh zE-%`o*{WhIa%4(v*=w|zic8?fgFc`XW4NV-t>H>^*xY(C1Sc0uLj`5BL>Ug~+B(dx zD&9nmGA9t`%%dryYsFKL-f(g$N|JM?k{1L zj5BoAM_9RZ){0GV)j{oa0S+%Zao(R`+CeKSzYZxGZ_BEJ!^NPRAVyV8$DbUznWX83GZckkHC2o%Kt>wTfK=nmG_9y)KP%Hv>g+N{N&yg-D&%vl?3rWEq#eui zZ=EeF47FsyOfJk3!!nKKL#SH7lEie_d^poF6=tG6_`+?ZQyVStTUsFYGip7xz)^{E z7vv_DJlayvDtU~fKqyk=prYWhx?pNHZpU?o8e~iac<$-KEiJ~MuAf!m3066<3M*D@ zm1ChL4s(E7in37STV|ih;wIjRl3n?`XG6b9V6>W)cAKmjCyKL_Sv1N7?L4ipC1gr5 zR8KO*`DtpR=rUCRO6tNJqv1AwDW^)hIy*{8Zmg>- zX+Cf2lnE`(ZCx8DG`4k>U}IcKb6Z_YSAAIXSx8Cqf@;p*!Li?sL zkK$yVpfLnmU+-$%{v=Ri&2o^dhP(8MqE1m5o?U!m?!MJ97G9)W9wR-Perf+PQeFGf zfAIoi_onL@eJFq2dtD#p-sv9QfInx&|7_dbVCFpK8g+)*y`p5IIsCyNf*InOC7Rx~ z+iWKO`$_!kj+zbTI)MhPJpR;2PtIH9I(P7*X)|V;<%{ZO%)EKV%-D>XCGN1f%RTU; zZ~eZ{-SLt8jD7CcT}RBoqU~?5C}}o_|9+b}x{)%{_oZL90PG^K{dO((BSfx`-B*2N zHoMzycklh`TV~A6-G6N!TrTlgKj)<(T=@MlY zOVqqeBCi>Bzpu=<-hSNuqia^0UwORy(I?H)C(RkZBsu*t{Pm=FIp7%ro72;~%#p8d za<9Mr(i!dn*UeZk!`<27&RuC<=Kjhn?mRPU4%duY6Sv>YA@1(fN(>YwzRo0brhEBy z=JoC|qOE(~b?#jAcH<)R;g1$Qj~3YdnlO!(zeC&`_qlUEG6U}1>yEp#AA9`K2Oe>s z`ou0;NJxhzkE>$$UDv!~Hr13)eqf_cU8tioJ{GHwFo$2idqs(RK*MhLfPH^) zub=K7IQ`r|xN~;BEzq4Ck; zo4Z%IziTv@fs29exyx%q>I`iGvAoq6n(2v}8 zsN7fX5WZdM?oH-(?g0yTub(x|z02hqZT#`3#$k<5ndQqSO}eRT+hy*J(J3xBM$lHA zERAny<%8jldKJ=LQbpVGVSZ=0W4)a0%j0_S^{xKIKh)WTF^Zd@PCHF^4Zh9q*wlc- zkZ}<8#UXs^ycWj*w}$XxFh5)lW7O+t#>j=77wdzits{ZsM+%3UYCD@Gj~?o=HqCHgrHC z(E~jEa9*uxfcZf03`0YFho7uIl)~WM+#a=LT0HurXdJiD8O5jLq{*S*Xc7G9N6$%8 zc&f32Ivs0aSu)3s%!;?;m}Tro6B|f{V1JyUkaB=ATd20hwwN&Mv%KS{I(IhJq8Lcu z5UyP-U&mvc0?jMT)|c4f`jF_ZT3bSFwj@1y(uMx0U!mpg;~&;;s28PevAU5k=Y={U z>NEk?84#_ZhK?|ra2-8>hhSS?REd_WN;!fXI$Nr$Iuy$zAaIsML`toz#nBkfhOVuz z=ZqZbic-lsxN6k0hT{lsHgzW)Sy~#JiaRCwCHy1)(SLB$Y|hA9LupJpE!qM;#d#J7 z0pL#;7AcKw`23wa-yNRU5pKmd|2X6wmF)kp?9@Zp^}++}OOsDphtO6WkKNp^UD&co zMA5gzso3MBvapy`2{AiZ8`euiFAbO zo7ZCuV7>Z3?^})$7w<+^G+1-Ad3_k&(9xYv>kRSZ@!|6kxOsbR{bcISx@q*h(|n50 zPaD9@3#|I^wrs8~n(S7R9% zKN=p=5{I5x#akLVJjpunULQyiN*tAr210AXV7iM%@Jbs8-*;Nazw2SGxve2W1))BA zRkE%0h{s~7n;efHg0$1EYz;J6X(kDP6Vp*KV1(K?VF1UG6%8T2XQw;rp%KFAXZ8W| zQh7PrpM!`s%;SWOI!rOBOkn`qkb|dfojX`=xl0kz^Kb*KWu~5 zJj=kU7^kpA*#kHUIe#VrI$63TrWNUu&YwtV4bi@iF@)XI(O6PD9QmThWO{_Q?mYR4 zfmX4N3}YgBeKR_k^e2bn7^TB@Kc&BgdC*KJti7(QxnmP6;T)eVe_^VwFxCZnmef5; z`ViV)W@SCT!dNmmu-P^`+AXOkp)WULGKsgnvy$=3gw}PTlSP#bL#YD}hT0^FC>DCK zDy{7yOS}vg6ZIf5iH^$sc9K|z0=3IySrMWj%=$9D2RBt#S<{WQD31L9!W+<%ZHFqe}V*Slf)@oA^e~Qh5;VbB4i+Wu0*{go5MLJMZ$d<#qw{Ew z)`K|5!!VXdm`V6!F&qlxV+c+h<6ViOIvkdv&>TGEh|h45mYXothjT=5(_%T<%PuayMyzYX z4Tqy!w&>v&ZPeTuYD{Tm3@46SOD^8$g*st>Hmh^3YTr7@IFy)rxb^_2JOz@QC>yh% za)Ay*>mO`^+Wq}hPpe*3Ikd)UX-Z~o>rPQO6NVE}3%#3tM|bMDS(hReokx5u3^hq~Hu$Xxv- zsV3~L*V3>DrxwX&{pgVOvqyL$uCS8~PhFQ>gJ_2a@mDUsbNXT`9_yZPFnA z%7sl7Uqa;@-th>?`xQjZ8pL0@#^CQ4Q%gXdhhV6naO2P9)03+3AeqOOf$PVJp3&f8 zM8DIZotJwBFVIPh?hvqsdEU~X&3FmW(mN}W?TjI3P}nw(u~U!jLV&jUo2*8BJa}x-w=uMyt{#ZN0OHO2GJihXiL83OR3ZF z7=8f)YQku9>g!Wd-4uWunS zk*9`b=sfXqZU)n>IuE0N7jStZ&+q|ZUOA1r+$09kd4^hi1c46(PX^&VZ$Y=oG8Nw8d?ndyakB#6Rgbru|qhWY^ zt_g%@BOnK(%j1O8r7xlMsUl=KBU}0shxFx6=}YdQ^f@AZIU`&8k~?ha-+;((Yuy?B zL%H;j?+Qk95nO6_+%3L?dhuf(cnZZlf&h@2 zMoXq3qj8ccD)IRO@1Ad)%Yz&=fT30}vg@5L1#BVoI_?Oi5OVDO89b%<1BpLWSr|i4|t%E44R38`46k=4%k`1Z|btKuE zQoBV6@PI}{9U5fB(lSJ6)YWEx27dFb_8ms_AJlQ>e#9&nQW(*fm~59z*p{#ubk@yc zJ)}XK`WA%p@H9{v@gqS@y^O4)R@v2q%vF6zx5`@OC~K81ZL1@nlh>v@WikH}1Qf@J z?aCr-R=T2mjP0n(YVdSuKATPL1 zwxp4uaFaA7G1A$WGrP{SJdr0pJ@DAmyAY6v(Z>QV{}-Z6k+l3r*zNZ`_am!#9v%jB zOc;ZVbenu(; zjsm*F<`u-|PDfu!ADJDWQm=s>wrN{1V(Y@Gs6X2gAe-`K0fUTq%#g$DFs7->i;mXRvGT;QFIgX-5+M<%_+E z&G^Oc@KxC9>j>x(cA>j~{z}ZZTVfx!wmMqLLH3YMljHuiA4$(3U`QqP4;r*(a~I+l zQ?pSLKPyLTNW3$-WCz(pHcgI~JQYb5l4A*}JY@z-*dH2Vuu2OJ-bv;H-0k z>`9R0B|i!BAp{in5~4q8&@TCzFQrzXq=iyia2cX2G|1>{0xoCNt5X@>tyAws^m`53 z65RJ%G@Tum!=s?7Q&P^Z*#fBdkUs&A!F}=r7&A_uY@X+@lEg zW#9Gko|?DI_Ql)RD-j+$7r{LCWlso{!O_mXehiqMn#WHZbEH4<1?lIZLsTFH z5mqDEm)%8E(;ov5yVt7-A2|5!j+L6OiaR&8;w1~>XorrQYzRm8hl{aSuvp$9OlYoG zg2@xS;`&W($f+d8BQl{_?^%+N5NLQSLOu<&x8QD3-s2QU`EIuu5969aipcLt7l)hh z(g6ENLQVC^X=6G^sJ5e{c9YIw!&laU4Z>?%o9j?;1OoA=SW3|n@dMTP-Zj$7pJV_l zwxu*8b8TBAUL#njyr{KFYu0px*V`0qm<-!6pU+xM+$>{(mL$7jlH)w9D`C5l5co+c zFE>U{UOeNJmmB|hVXv@UZf=gm#WPBIx#e?b?3c7$&y5j^*Pb}8eS53rQf|)Sxb|5t z;8vRPXdI`{qI+>1!sVv_;^JAYyxchXg4d}yjzJLD%0h`i$1sO0ZsM}xL%Iq{6rRR8ppA77Z-mUnwMJ!O#tP@h@T==2ujX%dLhwFyqi$c@S$k~>6X2)-&^$p4`?%syl(@y?Qg*T`+?gR z^*IE@K9_;=Un3FC!j>og5n}sf0^;c?IN+cU2X3DuKstT79CV%!KzteE)o9jy3vWPd zf3i;cSBYbO<8xZ#oO0~XnTg*A-2Pgb_yOSdC$_}7`Pu$vmiS+Q+n=-&{}=huj3rim za@fVtjGHZdEO7fnJo3*W9nHGaqVr2T`#Uw#+sI#mB{b*;{Oua@1241i8-bSt4_NrO zfv=v8jrtb;FmQgaML%HvUjV-oc&UZI0i0ij)mylM*uL0aCqeg3&?yEM3?2*-PJgm_ z8IwO7boOVC9Mpd_@B`(f>hdQ8xBHu+a^<%Jj>3((V(0TrmJwD~Ys(lVRN0YPlkO>HW zj8L3{&rHFWq~LWacxMW}Ed~EZ3VwGA{xb(Y0{Z;Ufm6R&3jWU&+;l8^$Uh_nACrPl zPQjharU3F^l0yGV3f`51-;jdel7ioxg8w)LKbV65AqD4YarVXf@lm*a5kC`nQ>9M9 zsYZ(D3fLFvB`NrYz!Uy6MDg=*`yxLdA=(%5wJG?96nuLM{#^$iKz<%G@2KIeDL%Fcg%(yW2~{sx zx(vT2hOLv~M(lJ8cVI&p-T+71u+r%#DTMd)p~jZTnp*6X!1j{PP;J*n#od1V1+V(z zDU;4WACmiF3USS*S76u?il4+%dd*hf)!K@!rq&8hFxj$`#G1S*DCu>yy*(f)5idQh zy%ed*r)@waYy8*ZlHZYoWbOR;vi)sICCDN*DTNyguoDvN$fRUz-(ymm^`bW^E%|MG z63Kc4pOnT|y~zb7wi+cd>es@pDZKFtC-ElljYuW+XHmU(&B-ZSaU6RWEKu)vNZzKH zwAaEZg9Lj+c~W}6Qcy!E&fROFP}P!(MRP-Q7tevKYrnVQjZ>!-gEQ1#7m7A@wXH2) zgH0cy`pyV8!?x99KTK%OrHd;TVeixz>;?~omMyBZMbE3gcy>i~=;ErXrE`~smQ~EI zo{L}V)0>gF|0S_GCR8bVu0jizEy7+2yQe`EyWTSHU<0$>i72LvZxG<-ZN1ecX-7c? zHXUHw2lv{C!g3Q6&w*qmz3;Rtl$Xz|UNE~dGzlN@=`BM`y4s@6t=6s~y*FcNe0Nk_ zqGN+sJZ+w}t08sk5o*Cby4EHO%Lx21DrD6wdAp@96MMMzHkn1WQEX0Q6V`34WhL+v zidTgbdQZd=><*(Ql;~%xm*}DQ3a4yia!6RpU2$3odlM`-lwTD8oFmlO8foK)0Uc5P z3Zr8$uEP|vRS(LrRlt+FaTVLTW^<2S4S&_qDlPsEfxW*ZREe!B(J(iTNM)>D8~yJa zikD6Iuy#}>rB$Wu_YXmb#c(w^2Yz7^J|i3WsA#Yj`}w6&STc7%i%miy+!X72BfbA! z)6RXjme$G6tJ{YrStPs79Gjy<3)f>Kx1NJ4`Ma93V~@6{5u4Xw3$WhHrW?oFF(m!x z3wlq|&h7s8&*`n9RwXS(ij|D}s}f}Cox{8qewXDD>!w3lhTf5R_YN65!} zA%<$e_Og_G3{w&GJ(j-T=RNOAu;L`!}@p%FRe>=sNM}8EcS`o-M8-dRm7>X=D zK25Os)&r)lT<&l^!!Q!CeUXpXIs}`K&m|aEQwi&$O~}jpH=B?5Hw=#=*cbVDU58-v z@jiip_cr!rm%AMa0w@;?0qIFL<4QXGC1FsnyC-tQm%0=@&Fvt07=zVPKQ;Cl{qwgvfk|Mx2R zVu0vr%3ESM2_c=aLJF!86r zw`~L=ec3b~BVfa%RN`I6Nh)hyHcie+v=b3e!|@Hv(h>69S89{{N9##VG7@e*PuNdcDDKOs77pT%iDb&Hh$SeB-$WjM|SmkH=eVgfoPh= X2y9=f%dx;=235TiIy?N{miNB_OW-N~ diff --git a/Linux_i686/lib/python3.4/site-packages/sqlalchemy/cutils.cpython-34m.so b/Linux_i686/lib/python3.4/site-packages/sqlalchemy/cutils.cpython-34m.so index f9744340767d0d38dd922e0f7c4096647910ddd4..caaa5f52b715eb0606f17125a9ae93385da66f92 100755 GIT binary patch literal 18343 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